题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
分析
要判断链表是否有环直接用快慢指针即可,但如何找到入口结点呢?
画个草图分析一下:
快慢指针在红色标记处相遇,则有如下等式成立:
2(A+B)=A+2B+C
得到:A=C
那么此时用另一个指针从头结点开始,每次移动一步。最终,它们会在入口结点相遇。
代码
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null) return null;
ListNode fast = pHead;
ListNode slow = pHead;
while(fast!=null && fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow) break;
}
if(fast!=slow) return null;
ListNode tmp = pHead;
while(tmp!=slow){
tmp = tmp.next;
slow = slow.next;
}
return tmp;
}
}