在判断链表有无环中,一般刷过力扣的都知道用快慢指针解
而快慢指针就是借助一个慢指针和一个快指针来实现找到环
具体的原理力扣上讲的很清楚,这里更多的是对快慢指针为什么快指针一定要是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
所以我们可以得出,如果两个指针从链表头和双指针相交处以同样的速度开始移动,那它们一定会交汇到环的入口