算法分析:
现在将快慢指针在同时定在链头,并且快慢指针速度不同,快指针每次移动2,慢指针每次移动1
v1=2,v2=1
s1,s2分别代表链表不循环的元素个数和循环元素的个数。
当慢指针到达环入口时,记快指针已经从环头开始走的距离为d1:
d1=2∗(s1/v2)−s1=2∗s1−s1=s1
- 假设 s1<s2 ,此时快指针位置距入口s1,慢指针刚好在入口
第一次相遇时,设距离入口为d
t=d,2t=s2−s1+dd=t=s2−s1
分析:慢指正还要走多少步才能重新到达入口呢?s_2-d = s_1\
所以,现在,慢指针在距离入口为d的位置,快指针重新回到开始位置,快指针慢下来 v1=1
当慢指针重新到达入口的时间t:
t=(s2−d)/1=s2−(s2−s1)=s1
这个时间刚好快慢指针同时到达入口 ,此时函数返回开(或者慢)的位置
- 如果 s1>ns2,这里n是使得上不等式成立的最大整数.(如此s1−ns2<s2)
此时快指针距离入口s1−ns2,慢指针刚好在入口
第一次相遇时,设慢指针走的距离为d
t=d,2t=s2−(s1−ns2)+dd=t=s2−s1+ns2=(n+1)s2−s1
分析第一次相遇时,慢指针距离入口有多远的距离呢?\
分析:d=s2+ns2−s1=s2−(s1−ns2)<s2
所以可见,d就是快慢指针到入口的距离。
再分析,慢指针再走距离s1,可以到达入口吗?d+s1=(n+1)s2
显而易见,慢指针又重新到达入口。
如果快指针重新回到开口,并且速度变为每次只走一步(与慢指针速度相同),那么,快慢指针同时在入口相遇。
此时返回快(或者慢)指针,就可以啦!
#寻找环链入口#