对于一个给定的链表,返回环的入口节点,如果没有环,返回null

注:需要提供无额外空间的算法。

 

思路:先是判断是否有环。再来获取其入口。

  1. 是否有环

数学上有这么一道题目:有两个人比赛跑步,一个人先跑,那么请问另外一个人怎么样才能追上这个人?

 

解答过程当然是:。然后根据条件得到b的值或者t的值。那么引申到这个题目上来讲:假设a、b同时跑,b跑的快、a跑的慢,怎么样a才可能追上b了?答案当然是400m环型跑道,当我超你一圈的时候,你可以吹牛说你追上了我。那么这样答案就出来了:

设置一快一慢两个指针,一个跑的快a、一个跑的慢b,如果存在一个时候a = b,那么就有环,如果没有,那就没有环。

  1. 入口

那么怎么求入口了,数学上来讲就是:先画个示意图,获取可以发现规律。

Leetcode - Linked-list-cycle(i,ii)

 

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

Leetcode - Linked-list-cycle(i,ii)

 

即a在t时间内进入了圈 L,又走了Na圈,最后从P1到达P。

b在t时间内进入圈L,又走了Mb圈,最后从P0到P。得出:

Leetcode - Linked-list-cycle(i,ii)

 

又由于x和R之间存在关系,设在b未到达入口时,a走了k圈:

Leetcode - Linked-list-cycle(i,ii)

 

计算得出式子

Leetcode - Linked-list-cycle(i,ii)

到此,目前我掌握的知识推导不下去,那么通过任意取K和n的值即可,但注意要符合实际情况,别n=2,K=10这种假情况。

那么根据很多其他人的解法,此时n=2,K=0,得出r+L=R。那么此时把b放回起点,a不动,取速度都为1,即可同时达到入口。

相关文章: