如何在给定的链表中找到循环的开始节点?让我们称之为循环点
到目前为止,我已经了解以下内容(使用慢/快指针):
- 假设列表具有大小的非循环部分
k
- 慢动作 k 步
- 快速移动 2k 步
- 快速是(2k - k)=
k
慢步ahead
- 慢是在循环的开始;也被称为
Cycle point
- 快速是此时的
(LOOP_LENGTH - k)
步数或慢速指针behind
Cycle point
- 每走 1 步慢动作,快走 2 步,慢走 1 步。
(LOOP_LENGTH - k)
因此,遇到慢速和碰撞需要快速的步骤- 这是我不明白的步骤:
在这个碰撞点,两个节点都
k
将从循环的前面开始。 - 一旦找到碰撞点,将一个指针移动到列表的头部。
- 现在以 1 步/转的速度移动两个指针直到发生碰撞。它们相遇的节点是循环的开始,因此
Cycle point
有人可以解释一下第 9 步和之后的步骤吗?
谢谢
编辑:
我想指出的一件事是,一旦进入循环,快指针永远不会超过慢指针。他们会发生碰撞。原因如下:slow 在 i 处,fast 在 i-1 处假设。当它们移动时,slow=> i+1 和 fast 也将在 i+1,因此会发生碰撞。或者,慢在 i 处,快在 i-2 处。下一步,slow-> i+1;快:我。下一步,慢-> i+2,快:i+2,因此再次碰撞。这么快永远追不上慢,只能在循环内碰撞一次!