题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解法
快慢指针法
若假设有环存在,则快慢指针会交汇
若此时初始化一个指针从头结点出发,则这个指针与慢指针交汇的结点为环入口结点
此结论可通过画图证明:
假设进入环前的路程为r1,交汇点与入口的距离为r2,余下距离为r3.
则慢指针路程为r1 + r2
快指针路程为r1 + k(r2 + r3) + r2
然而慢指针速度是快指针的1/2
因此化简因式 2(r1 + r2) = r1 + k(r2 + r3) + r2
r1 = (k - 1)r2 + k*r3 (k<=1) 且 r2 + r3为环总长度
所以r1 = r3
详细代码如下:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode n1 = pHead;//slow
ListNode n2 = pHead;//fast
ListNode n3 = pHead;//result
if(n1 == null||n1.next == null){
return null;
}
while(n1 != null){
n1 = n1.next;
n2 = n2.next.next;
if(n2 == n1){
while(n1 != n3){
n1 = n1.next;
n3 = n3.next;
}
return n3;
}
}
return null;
}
}