Linked List Cycle II Floyd 方法

1,二指针方法。如果一个跑的快的人和一个跑的慢的人在圆形操场比赛跑步,跑的快的人肯定会在某个时刻从跑的慢的人的别后追上他。

2, Floyd 方法分为两个步骤。

    (1),确定list里面已经确定有circle的情况下。找到faster 和 slower 的交点, 并返回这个交点。

    (2),如果有circle, 利用(1)的交点找到circle的入口,并返回这个circle的入口。

3,Floyd的分步详解:

    (1),list中的circle的哪个地方相遇:初始化两个指针,fast (hare) 和slow(tortoise)。hare每次前进2步, tortoise每次前进1步。在有环的情况下, hare和tortoise在某个时刻肯定会指向同一个节点。

上图,cycle的节点的lable是0~C-1, C是cycle的总长度。cycle外面的节点的label从-F 到-1. F是环外面的节点的个数。F次迭代后,tortoise指向0, 假设hare指向h。 此时有,F+h = 2F,F长度恒等于h。这是因为hare比tortoise要快两倍。假设再经过t时刻hare和tortoise相遇,那么hare走的距离C-h+t+nC, toroise走的距离是t+mC, 同时, C-h+t+nC = 2*(t+mC)。t=C-h。也就是经过C-h时间后,它们会相遇。那么这个时候torroise指向C-h节点,hare也指向C-h这个节点。

(2),(1)已经找到了交点。现在利用这个交点,怎么找到环的入口?


由上图,2(F+a)=F+a+b+a, 所以有F=b。也就是从交点出发,和从list的head出发,每次只走一步,他们会在环的入口处相遇。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值