环形链表
Created At :
进阶问题
为什么快慢指针一定会相遇
- 如图,假设非环长
a
,环长b
,相遇时距离入环口c
.
- 假设快指针每次移动
2
个单位,慢指针每次移动1
个单位.
- 当慢指针走到环的入口时,移动了
a
的单位,此时快指针移动了2a
个单位.
- 此时快指针在环中的位置是(2a-a)%b =
a%b
- 此时快慢指针相距
b - a%b
的距离.
- 由于快指针每次比慢指针多移动
1
个单位,则还需b-a%b
次移动两者相遇.
两者需要移动多少次才能相遇
为什么慢指针入环第一圈没走完的时候就会和快指针相遇?/慢指针要走多少圈才能和快指针相遇
- 根据上述推导,在慢指针如环的时候,快指针在
a%b
处
- 只需再走
b-a%b
就能相遇(b-a%b < b)
为什么快指针移动2步,移动其他步数可以吗.
- 如果快指针每次移动
x
步,x>1.
- 当慢指针走到环的入口时,移动了
a
的单位,此时快指针移动了xa
个单位.
- 此时快指针在环中的位置是(xa-a)%b =
[(x-1)a]%b
- 此时快慢指针相距
b - [(x-1)a]%b
的距离.
- 那么最终则需要
a + (b - [(x-1)a]%b)/(x-1)
步才能相遇,此时该值不一定是整数,所以移动其他步数不一定相遇.
为什么第一次不相遇,之后就不可能相遇.
- 假设慢指针在环入口的位置走了
a+nb
步.
- 则快指针
xa+xnb
步,其中xnb
相当于绕环xn圈,相当于此时快指针一定在距离环xa
处,重复上述的操作.
如何找到入环结点
- 根据上述推导后
- 当快指针和慢指针相遇的位置是:
a + nb + (b - a%b)
(nb为快指针绕环的圈数)
- 又因为
慢指针在第一圈一定能和快指针相遇
,所以快指针的位置还等于慢指针的2倍,即: 2(a+ b - a%b)
- 联立两者得:
a = (n-1)*b + a%b
- 我们知道快慢指针相遇时的位置是
b-a%b
,我们加上a得:b - a%b + a
= b-a%b +(n-1)*b + a%b
= n*b
- 所以我们只要让相遇时的指针再走a个单位就能到入环结点.