题解 | #链表中环的入口结点#

算法分析:

现在将快慢指针在同时定在链头,并且快慢指针速度不同,快指针每次移动2,慢指针每次移动1

v1=2,v2=1v_1 = 2,v_2 = 1

s1,s2s_1,s_2分别代表链表不循环的元素个数和循环元素的个数。

当慢指针到达环入口时,记快指针已经从环头开始走的距离为d1d_1

d1=2(s1/v2)s1=2s1s1=s1d_1 = 2*(s_1/v_2) -s_1 = 2 *s_1 -s_1 = s_1 \\
  1. 假设 s1<s2s_1 < s_2 ,此时快指针位置距入口s1s_1,慢指针刚好在入口 第一次相遇时,设距离入口为d
t=d,2t=s2s1+dd=t=s2s1t = d , 2t = s_2-s_1+d \\ d=t= s_2-s_1\\

​ 分析:慢指正还要走多少步才能重新到达入口呢?s_2-d = s_1\ ​ 所以,现在,慢指针在距离入口为d的位置,快指针重新回到开始位置,快指针慢下来 v1=1v_1 = 1 ​ 当慢指针重新到达入口的时间t:

t=(s2d)/1=s2(s2s1)=s1t = (s_2-d)/1 = s_2-(s_2-s_1) = s_1\\​

​ 这个时间刚好快慢指针同时到达入口 ,此时函数返回开(或者慢)的位置

  1. 如果 s1>ns2s_1>ns_2,这里n是使得上不等式成立的最大整数.(如此s1ns2<s2 s_1- ns_2 < s_2) 此时快指针距离入口s1ns2s_1-ns_2,慢指针刚好在入口 第一次相遇时,设慢指针走的距离为d
t=d2t=s2(s1ns2)+dd=t=s2s1+ns2=(n+1)s2s1t = d,2t=s_2-(s_1-ns_2)+d\\ d=t=s_2-s_1+ns_2=(n+1)s_2-s_1\\

​ 分析第一次相遇时,慢指针距离入口有多远的距离呢?\ ​ 分析:d=s2+ns2s1=s2(s1ns2)<s2d = s_2+ns_2-s_1 = s_2-(s_1-ns_2)<s_2 ​ 所以可见,d就是快慢指针到入口的距离。 ​ 再分析,慢指针再走距离s1s_1,可以到达入口吗?d+s1=(n+1)s2d+s1 = (n+1)s_2 ​ 显而易见,慢指针又重新到达入口。 ​ 如果快指针重新回到开口,并且速度变为每次只走一步(与慢指针速度相同),那么,快慢指针同时在入口相遇。 ​ 此时返回快(或者慢)指针,就可以啦!

#寻找环链入口#
全部评论

相关推荐

Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务