算法:环形链表

为什么在环中一定会相遇,只看两种情况

  1. 第一种:
    ...->1(fast)->2(slow)->3->...
    此时两者相临,
    快指针走两个节点,慢指针走一个节点,两者在下一个时刻必相遇
    ...->1->2->3(fast & slow)->...
  2. 第二种:
    ...->1(fast)->2->3(slow)->4->...
    此时两者相差一个节点,
    快指针走两个节点,慢指针走一个节点,之后回到第一种情况
    ...->1->2->3(fast)->4(slow)->...
    两者在下一个时刻必相遇,

简单公式描述

  • 假设慢指针速度为v,快指针速度为2v,
  • 则两者中间相隔的距离 L = 两者相遇需要的时间 t
  • vt+L = 2vt,即 L = vt,
  • 而 v =1 ,则有 L = t;

寻找环入口

假设快慢指针在环内相遇有:

  • 慢指针走的路程为 L+r,其中L为环外的路程,r为环内的路程;
  • 快指针走的路程为L+n*R+r,其中 R 为环的长度,n为圈数(对快指针走完的圈数未知);
  • 由快指针走的路程是慢指针的两倍,建立式子有:2*(L+r) = L + n*R + r;
  • 解得 L = n*R - r = (n-1) R + (R-r)
  • 若指针cur从起始处开始走,慢指针从相遇处开始走,两者每次走一个节点
  • 则慢指针经过时间 T 走完 (R-r) 路程后刚好到环入口
  • 而指针cur 经过时间 T 后与环入口的距离为L - (R-r)
  • 由上述式子可知 L - (R-r) = m*R
  • 即该指针走完剩下的路程到达环入口之后,慢指针也刚好走了m圈回到了环入口
  • 两者相遇,相遇节点为环入口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值