《剑指Offer》面试题56:链表中环的入口节点
题目:一个链表中包含环,如何找出环的入口节点?
1.首先判断该链表中是否存在环(使用快慢指针来判断);
2.如果存在环,设环的节点为m个,快指针经过的节点数为2n个,慢指针经过的节点为n个,那么快指针所走的节点为n2比慢指针n1走的节点数多m(即2n=m+n)个,所以n1和n2相交的位置为链表的第n个节点,重置n1或者n2都可以找到环的入口。
package com.test20160709;
/**
* Created by yan on 2016/7/9.
*/
public class EntryNodeOfLoop {
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null||pHead.next==null)
return null;
ListNode n1 = pHead;
ListNode n2 = pHead;
while (n2!=null&&n2.next!=null){
n1 = n1.next;
n2 = n2.next.next;
if(n2==null)
return null;
if(n1==n2)
break;
}
n1 = pHead;
while (n1!=n2){
n1 = n1.next;
n2 = n2.next;
}
return n1;
}
}