判断链表中环的起点

第一步:判断有没有环?

快慢指针同时指向链表头部,快指针每次指向后序的后序,慢指针每次指向后序,如果快指针追上了慢指针,那么表示存在环。

第二步:找到环的起点

假设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倍的环,于是在起点相遇。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值