野兔和乌龟算法。为什么链接列表的碰撞点和头部与循环开始的距离相同?

时间:2014-08-25 04:30:02

标签: algorithm

在Cracking the Coding的采访书中,给出了以下关于如何找到循环开头在链表中的位置的说明:

有一个FastRunner可以前进两个步骤,还有一个SlowRunner可以前进两个步骤(每个单位时间)。

k - >循环前的节点数 K = mod(k, LOOP_SIZE) - >当慢速跑步者刚刚击中循环中的第一个节点时,快速跑步者在循环内的步数。

FastRunner落后于SlowRunner LOOP_SIZE - K步 FastRunner以每单位时间1步的速度赶上SLowRunner。

他们在LOOP_SIZE - K之后见面,此时他们将在循环之前成为K步。

为了找到循环的开始,作者说: 从K = mod(k, LOOP_SIZE)开始,我们可以说k = K + M * LOOP_SIZE(对于任何整数M),然后就是我迷路的地方,她说从循环开始就是k节点是正确的。< / p>

据我所知,碰撞点是从循环开始的K个节点,但为什么它也是k个节点?她怎么发现K = k?

1 个答案:

答案 0 :(得分:3)

K 是循环内节点的数量,“跳过”的速度越快,直到较慢的节点进入循环。速度比较慢的速度快2倍,因此总共需要跳过 2 * k 节点的速度越快(因为较慢的节点需要 k )到循环)。所以它在循环中跳转的次数是K=2*k-k(所有跳跃减去它为了进入循环而跳转)所以K == k