Floyd判圈算法

判断一个链表是否有环

快指针每次走两步,慢指针每次走一步

这里写图片描述

第一次相遇:slow指针行走了 m+An+k(A表示slow行走了A圈环形。附:An 是因为如果环够大,则他们的相遇需要经过好几环才相遇)。fast行走了 m+B*n+k。

接下来slow指针回到起点

这里写图片描述

开始入环的第一个节点:然后每次两个指针(slow,fast)都只移动一步,当slow移动了m,即到达了环的起点位置,此时fast总共移动了 2S+m,此时他们在环开始处相遇!

证明:第一次相遇slow走的路程s= m+An+k,fast走的路程为2s=m+Bn+k;(2s-s)=(B-A)n,说明fast和slow走的路程都是环长度的倍数,此时slow回到原节点再走m步将到达入环的第一个节点,而fast走m步也将到达入环的第一个节点。他们将再次在此第一次相遇!

如果要求环的长度,可以这样做:

当两者相遇之后,固定一个指针,让另一个指针行走一圈,使用count计数,如果两个指针相等(即相遇),则count即为环的长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值