环形链表
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个单位就能到入环结点.