在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?
答案 0 :(得分:3)
K 是循环内节点的数量,“跳过”的速度越快,直到较慢的节点进入循环。速度比较慢的速度快2倍,因此总共需要跳过 2 * k 节点的速度越快(因为较慢的节点需要 k )到循环)。所以它在循环中跳转的次数是K=2*k-k
(所有跳跃减去它为了进入循环而跳转)所以K == k