题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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;
}
}
这是一篇关于算法题目的博客,主要讨论如何找出链表中环的入口节点。通过使用快慢指针判断链表是否存在环,然后从头节点开始以步长1移动的指针将与快慢指针相遇点相遇于环的入口节点。
2052

被折叠的 条评论
为什么被折叠?



