快慢指针证明(数学证明)

本文详细解析了链表中判断环存在的快慢指针算法。通过数学推导,解释了为何快指针速度至少是慢指针的两倍,以及如何确保快慢指针在环内相遇。讨论了追逐问题,并证明了当两者以相同速度从相遇点开始,会再次在环的入口相遇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在判断链表有无环中,一般刷过力扣的都知道用快慢指针解

而快慢指针就是借助一个慢指针和一个快指针来实现找到环

具体的原理力扣上讲的很清楚,这里更多的是对快慢指针为什么快指针一定要是2倍速的理解:

在这里插入图片描述
这里我们需要确定的几个前提:

1.快指针一定比慢指针要先到达环中

2.a就是从链表头到环的起点,b就是环的起点到两点相遇的点,c就是两点相遇的点到环的起点

假设
慢指针跑过的路径为s1=a+b+x*circle

快指针跑过的路径为s2=2*s1=a+b+y*circle

两式相减得到:s1=(y-x)*circle

那么慢指针走的路程其实就是环长的整数倍

而从效率的目的出发

其实这些环长的整数倍的路都是多余的

所以我们完全可以将慢指针多走的x圈舍去

也就是s1=a+b s2=2*(a+b)=a+b+n*circle=a+(n+1)*b+n*c

也就是快指针在一圈内追上慢指针

那么这里就变成了追逐问题

快指针何时能追上慢指针

假设快指针速度为V2,慢指针速度为V1

给予极限情况,慢指针无限趋近于快指针

那么我们可以假设快指针至少需要跑2*PI*R的距离去追赶慢指针

那么可以得出花费的时间t=(2*PI*R)/(v2-v1)

所以v1*t<=2*PI*R

所以v2>=2*v1

所以快指针在慢指针的2倍速度的情况下一定可以在慢指针跑完一圈前或时追上慢指针

根据之前给出的结论:慢指针走的路程其实就是环长的整数倍

我们得到a+b=x*circle

a+b=(x-1)*circle+b+c

a=(x-1)*circle+c

所以我们可以得出,如果两个指针从链表头和双指针相交处以同样的速度开始移动,那它们一定会交汇到环的入口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值