题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路分析
1、证明链表是否存在环。
一开始设置两个指针都指向表头,其中一个每次(一步)前进一个节点的叫 p1,另外那个每次(一步)前进两个节点的叫 p2 。
p1 和 p2 同时走,当其中有一个遇到 null,就证明链表没有环。如何某个时刻(假设走了 n 步之后),p1 和 p2 指向的地址相同,那么链表就是有环的。
2、接着找到环的入口。
此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),这次两个指针一次走一步,相遇的地方就是入口节点。
为什么就一定会在入口节点相遇?
定理证明:
https://www.cnblogs.com/snake-hand/p/3148328.html
解释说明:
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null || pHead.next == null)
return null;
ListNode slow = pHead, fast = pHead;
do {
fast = fast.next.next;
slow = slow.next;
} while (slow != fast);
fast = pHead;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}