当前位置:   article > 正文

环形链表的快慢指针相遇的数学证明_快慢指针相遇,慢指针走了多少步

快慢指针相遇,慢指针走了多少步

我们说的环形链表是类似于下图的环形链表
在这里插入图片描述

慢指针一圈内必遇上

设我们的环长度为 C C C。假定我们慢指针的初始位置是环的入口(比如上图的2),设这个位置为0.
而快指针的初始位置是 A A A A ∈ [ 0 , C − 1 ] A \in [0,C-1] A[0,C1]
假设慢指针走了K步之后,快慢指针相遇,则慢指针位置: 0 + K 0+K 0+K,而快指针的位置是 A + 2 K A+2K A+2K.
此时,显然有一个道理,快指针的初始距离加上它的走过的距离超了慢指针走的距离的 n C nC nC.
所以可以得到表达式 ( A + 2 K ) − ( 0 + K ) = n C (A+2K) - (0+K) = nC (A+2K)(0+K)=nC
进一步化简可得 A + K = n C A + K = nC A+K=nC,我们令 n = 1 n=1 n=1时,因为 A ∈ [ 0 , C − 1 ] A \in [0,C-1] A[0,C1],所以 K K K有解,且 K ∈ [ 0 , C ] K \in[0,C] K[0,C],所以,必定在慢指针运行一圈有相遇。

快慢指针相遇时,另一指针从初始点出发,会与慢指针相遇在环的入口

在这里插入图片描述
设链表中环外部分的长度为 a a a s l o w slow slow指针进入环后,又走了 b b b的距离与 f a s t fast fast 相遇。此时, f a s t fast fast指针已经走完了环的 n n n圈,因此它走过的总距离为 a + n ( b + c ) + b = a + ( n + 1 ) b + n c a+n(b+c)+b=a+(n+1)b+nc a+n(b+c)+b=a+(n+1)b+nc.
根据题意,任意时刻, f a s t fast fast 指针走过的距离都为 s l o w slow slow 指针的 2 倍。因此,我们有

a + ( n + 1 ) b + n c = 2 ( a + b )    ⟹    a = c + ( n − 1 ) ( b + c ) a+(n+1)b+nc=2(a+b) \implies a=c+(n-1)(b+c) a+(n+1)b+nc=2(a+b)a=c+(n1)(b+c)

有了 a = c + ( n − 1 ) ( b + c ) a=c+(n-1)(b+c) a=c+(n1)(b+c) 的等量关系,我们会发现:从相遇点到入环点的距离加上 n − 1 n-1 n1圈的环长,恰好等于从链表头部到入环点的距离。

因此,当发现 s l o w slow slow f a s t fast fast 相遇时,我们再额外使用一个指针 p t r ptr ptr。起始,它指向链表头部;随后,它和 s l o w slow slow 每次向后移动一个位置。最终,它们会在入环点相遇。

参考资料

LeetCode官方题解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/64498
推荐阅读
相关标签
  

闽ICP备14008679号