剑指 offer 笔记 55 | 链表中环的入口结点

题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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;
}
}

https://github.com/CyC2018/CS-Notes/blob/master/notes/23.%20%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%8E%AF%E7%9A%84%E5%85%A5%E5%8F%A3%E7%BB%93%E7%82%B9.md

你可能感兴趣的:(剑指 offer 笔记 55 | 链表中环的入口结点)