当前位置:   article > 正文

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

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

环形链表的快慢指针相遇问题证明

证明1:慢指针一定在环形链表一圈内遇上

首先假设慢指针的每次只走1步,快指针每次走2步,当慢指针走了k次后,慢指针共走了k步,而快指针走了2k步。

假如说,快指针和慢指针一定会相遇,那么一定是在环内,同时快指针已经走了n圈环。此时该问题也就可以转变为一下问题何时有解

2 k − k = n B → k = n B ( n = 1 , 2 , . . . , N ) 2k - k = nB \rightarrow k = nB (n = 1,2,...,N) 2kk=nBk=nB(n=1,2,...,N)

当n=1时,此时有k=B,也就是慢指针走的k步等于环的长度。此时是否有解呢?显然是有的,因为 k ∈ [ 0 , A + B ] k \in [0, A+B] k[0,A+B]。所以肯定有一个值等于B。

而当 n ≥ 1 n≥1 n1 时,k = nB,则需要考虑A+B是否大于nB,此时不一定有解

因此慢指针一定在环形链表一圈内遇上得证。

image-20211103114204271

证明2: 当两指针相遇后,a = c

假设慢指针slow 走了 l s l o w = a + b l_{slow} = a + b lslow=a+b

快指针走了 l f a s t = a + n ( b + c ) + b l_{fast} = a + n(b+c) + b lfast=a+n(b+c)+b

而有 2 l s l o w = l f a s t 2l_{slow} = l_{fast} 2lslow=lfast ,因此求得 2 ( a + b ) = a + n ( b + c ) + b → a = c + ( n − 1 ) ( b + c ) 2(a+b) = a + n(b+c) + b \rightarrow a = c + (n-1)(b+c) 2(a+b)=a+n(b+c)+ba=c+(n1)(b+c)

而我们在证明1中证明了当且仅当n=1时,必有解,因此上式可以化为 a = c a=c a=c

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

如有错误,欢迎指正,大家一起进步!

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

闽ICP备14008679号