这是再次提供参考的步骤。
检测循环:
有两个指针,通常称为野兔和乌龟。将野兔移动2步,将乌龟移动1。如果它们在某个点相遇,则肯定存在一个循环,并且相遇点显然在循环内。
查找循环长度:
保持一个指针固定在会合点上,同时增加另一个指针直到它们再次相同。当您继续前进时增加一个计数器,满足时的计数器值将是周期的长度。
找到周期的开始
用一个指针指向列表的开头,将另一个指针保持在集合点。现在,将两者都增加一个,并且相遇点就是循环的开始。我在纸上用一些案例验证了该方法,但我不明白为什么它应该起作用。
有人可以提供数学证明此方法为何有效吗?
如果不使用集合点,则可以使“查找周期的开始”证明更加简单。 让第二个指针不在“会合点”处开始,而是M在第一个指针之前。(M循环的长度在哪里。)
M
这样,证明就很明显了。当第一个指针到达循环的起点时,第二个指针将恰好M向前:在循环的起点。