为何Floyd算法中链表环相遇点到环起点步数等于表头到环起点步数?
解惑Floyd快慢指针算法中相遇点到环起点的步数问题
嗨,我来帮你理清楚这个绕人的点!你前面的推导其实大部分都是对的,问题出在最后一步对「相遇点到环起点步数」的理解上,咱们一步步拆解:
先明确几个定义(避免混淆)
- 设:
k:链表表头到环起点的步数(也就是慢指针走到环起点的步数)N:环的长度- 相遇点:记为
M,是慢指针在环内走了N-k步后的位置(从环起点出发数)
核心推导:相遇点到环起点的步数为什么是k?
你已经算出相遇点M在环内的位置是环起点往后N-k步的地方,那反过来想:从M走到环起点需要多少步?
因为环的总长度是N,从M出发,走N - (N - k) = k步就会回到环起点!
这就是关键!你之前只考虑了从环起点到M的步数是N-k,但环形结构是双向的,从M往另一个方向走回到环起点的步数就是k——而Floyd算法里,当相遇后把其中一个指针移回表头,两个指针同速前进,它们相遇的地方就是环起点,正是利用了这个双向步数的等价性。
再用等式验证一遍
我们可以用数学方式更严谨地证明:
当快慢指针相遇时,慢指针总共走了 k + (N - k) = N 步,快指针总步数是 2*(k + (N - k)) = 2N,而快指针的总步数也可以表示为 k + m*N + (N - k)(m是快指针在环内绕的圈数),也就是 (m+1)*N,显然2N是符合的(m=1)。
现在,假设我们把慢指针留在相遇点M,把快指针移回表头,然后两个指针都以每步1的速度前进:
- 快指针走到环起点需要
k步 - 慢指针从
M出发走k步,刚好走了k步,而k = N - (N - k),也就是从M绕环走k步回到环起点
所以两者会在环起点相遇,这就验证了「相遇点到环起点的步数等于表头到环起点的步数」这个结论。
你之前的误区
你之前只看到了从环起点到M是N-k步,但忽略了环形结构中,从M到环起点的另一个方向的步数就是k——而算法利用的正是这个方向的步数,不是你一开始想的从环起点到M的方向。
这样是不是就通了?
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

