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

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

证明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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值