141.环形链表
判断是否带环:用快慢指针,快指针走得快,如果进环,会追击慢指针,会相遇
如果不带环,fast或fast->next为空
代码如下:
延申问题:为什么一定会相遇,有没有可能会错过,永远追不上?请证明
假设slow进环时,fast和slow的距离为N
每追击一次,距离缩小1,距离为0就追击上了
slow一次走一步,fast一次可以走三步四步吗
slow一次一步,fast一次三步
假设slow进环时为与fast距离为N,之间距离变化为2
分为两种情况:N为偶数,N为奇数
当N为偶数
N
N-2
N-4
……
4
2
0
追上了
N为奇数时
N
N-2
N-4
……
3
1
-1
已经错过,进入新的一轮的追击距离变成c-1(假设c是环的长度)
如果c-1是奇数,下一轮就追上了
如果c-1是奇数,那么永远追不上
那么会不会一直错过呢?
如果存在c是偶数且N是奇数,那么就永远追不上
slow走的距离:L
fast走的距离:L+x*c+c-N(假设slow进入环时,fast已经走了x圈)
因为fast速度为slow的三倍,相同时间,走的路程fast为slow的三倍
3L=L+x*c+c-N
2L=(x+1)*c-N
偶数=(x+1)*偶数-奇数,不存在
所以一定能追上,其他以此类推
142.环形链表ii
假如相遇
假设相遇的点为meet,进入环前的距离为L,环长为c
相遇时slow走的距离:L+N
fast走的距离:L+x*c+N(假设走了x圈)
fast走的距离为slow2倍
2*(L+N)=L+x*c+N
L+N=x*c
L=x*c-N
当x=1时相遇的点就在slow入环时,同理当x为让任何值时都是当slow入环的点相遇