我是废物

这道题我放弃了,想不出来
看着评论区写的,代码如下:

def EntryNodeOfLoop(self, pHead):
    slow, fast = pHead, pHead
    while fast and fast.next:       # 首先判断是否有环
        slow = slow.next
        fast = fast.next.next

        if slow == fast:
            break
  
    if not fast or not fast.next:   # 无环则退出
        return None

    slow = pHead                    # 有环则使一指针从头结点开始
    while slow != fast:             # 与另一指针一同后移,相遇则找到入口结点
        slow = slow.next
        fast = fast.next

    return slow

虽然写完了,但这到底是为什么我还是没想明白
遇到困难睡大觉

为了想明白我画图去了
首先,设 a 为头结点到入口结点,b 为入口结点到相遇点,c 为相遇点到入口结点
则 fast 的路程为 a + (b + c) * k + b, k = 1, 2, ……
slow 的路程为 a + b (我就卡在这了,想不通为啥 slow 不会跑满一圈)
可得 (a + b) * 2 = a + a + (b + c) * k + b, k = 1, 2, ……
化简得 a = (b + c) * (k - 1) + c, k = 1, 2, ……\

然后我为了验证 slow 会不会满一圈疯狂画图
最后的结论是:我无法证明,只能给结果

当 slow 在结点入口时,fast - slow = c,即 fast 距入口结点距离为 c
此时 slow 与相遇点的距离为 b,若 fast 移动距离为 2b,同样抵达相遇点
就,非常的 Amazing 啊

然后我不理解,又回过头看 a = (b + c) * (k - 1) + c
如果 slow 走了 a(到入口结点),那么 fast 走了 2a,即 a + (b + c) * (k - 1) + c
圈长度 b + c 可忽略,则此时 fast = slow + c
这样就能说通为啥 slow 到入口结点时 fast 到 slow 的距离为 c
所以 slow 到入口结点后只要移动的距离为 b,就始终能与 fast 相遇与相遇点
b < b + c,所以 slow 始终无法走完一圈

我是**