链表OJ-带环链表

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入环的点相遇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值