第一步:判断有没有环?
快慢指针同时指向链表头部,快指针每次指向后序的后序,慢指针每次指向后序,如果快指针追上了慢指针,那么表示存在环。
第二步:找到环的起点
假设a为进入环之前的路程,b为慢指针在环上走的路程,x为环的周长。
那么,慢指针在环上距离起点的长度为:b%x
快指针所走过的总路程的:2(a+b)
快指针距离起点的长度为:[2(a+b)-a]%x
因为快指针最终追上了慢指针,也就是他们距离起点的长度相等:b%x = (a+2b)%x
根据同余定理,(a+b)%x = 0 。
根据上式子可得:a = n*x-b 这个等式可以理解为,当一个指针走完a的长度,另外一个指针还差b的长度就走完了n倍的环。目前把slow指针放回head,每次指向它的next,让它走a的长度;fast指针位置不变还是在b,速度变为每次指向next。那么当slow走完了a的长度,fast应该刚好走完n倍的环,于是在起点相遇。