我是废物
这道题我放弃了,想不出来
看着评论区写的,代码如下:
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 始终无法走完一圈