链表环

问题:给出一个链表环(像棒棒糖那样的,一个直线链一个环),问如何确定直线链和环的交点?直线链长多少?环长多少?

乍一看没大有头绪。感觉一般带链表环的总会用到追击法(一快一慢移动两个指针)来求,试一下吧。

 假设快的指针为fast,慢的为slow

 fast步长是slow的两倍(几倍都行无所谓,两倍好计算)

 fast追到slow时,slow路程为s步

 直线长a,环长n

 相遇的点距离交点为r

 开始分析吧:fast追到slow时,slow一定不会走完一整圈的环(自己思考为什么,可以用极限的方式思考),那么fast比slow多跑整数倍的n(为什么是整数倍,我们可以想象一下假如fast已经走了超过一圈,就当4圈吧,现在在距离slow 987/1000*n的位置,那么fast要套slow一圈是不是又得多跑13/1000*n呢?是不是多跑5圈,整数圈?fast未超过一圈时,道理一样),设为yn吧。

2s=s+yn

s=a+r

由上二式得出

a+r=yn,推出

a=yn-r,推出

a=(y-1)n+(n-r)

那么n-r是什么呢?其实就是与r互补的那部分。

让slow回到最初的原点,fast与slow用相同的速度走,便可以找到交点。只不过fast又转了y-1圈而已。

有了总步数和直线长,环长计算出来分分钟的事情。(其实让fast回复二倍速,二者再次相遇,也可求环长)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值