对于一个给定的链表,返回环的入口节点,如果没有环,返回null。
注:需要提供无额外空间的算法。
思路:先是判断是否有环。再来获取其入口。
- 是否有环
数学上有这么一道题目:有两个人比赛跑步,一个人先跑,那么请问另外一个人怎么样才能追上这个人?
解答过程当然是:。然后根据条件得到b的值或者t的值。那么引申到这个题目上来讲:假设a、b同时跑,b跑的快、a跑的慢,怎么样a才可能追上b了?答案当然是400m环型跑道,当我超你一圈的时候,你可以吹牛说你追上了我。那么这样答案就出来了:
设置一快一慢两个指针,一个跑的快a、一个跑的慢b,如果存在一个时候a = b,那么就有环,如果没有,那就没有环。
- 入口
那么怎么求入口了,数学上来讲就是:先画个示意图,获取可以发现规律。

假设入口之前距离为L,入口为P0、相交点为p、整个环的长度为R、他们在相遇时,其离入口的距离为r。设两个速度为Va和Vb,Va =nVb,设当b到达入口时,a到达P1点,距离入口为x,从b到入口,到p点相遇这段时间内,a走了Na圈,b走了Mb圈,得出下来方程组:

即a在t时间内进入了圈 L,又走了Na圈,最后从P1到达P。
b在t时间内进入圈L,又走了Mb圈,最后从P0到P。得出:
![]()
又由于x和R之间存在关系,设在b未到达入口时,a走了k圈:
![]()
计算得出式子
![]()
到此,目前我掌握的知识推导不下去,那么通过任意取K和n的值即可,但注意要符合实际情况,别n=2,K=10这种假情况。
那么根据很多其他人的解法,此时n=2,K=0,得出r+L=R。那么此时把b放回起点,a不动,取速度都为1,即可同时达到入口。
本文介绍了一种无额外空间的算法,用于检测链表中是否存在环,并找到环的入口节点。通过设置快慢两个指针,首先判断链表是否有环,再利用数学模型确定环的入口位置。
291

被折叠的 条评论
为什么被折叠?



