因此,我最近遇到了一种算法来确定链表中是否存在循环。代码如下:
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null) {
if (fast.next == null) {
return false;
}
if (fast.next == slow) {
return true;
}
fast = fast.next.next;
slow = slow.next;
}
return false;
}
当我试图证明这个算法的正确性时,我想到了一个主意:
假设循环的周长是“A”,两个指针相交之前经过的时间是“T”。由于“快”节点的速度是“慢”节点的两倍,因此我们可以得到数学关系:
2t模式a=t模式a
现在“a”是表示周长的常数,“t”可以是1,2,3….那么,我如何证明无论“a”是什么值,我们总能找到一个“t”,从而使上述方程是可解的呢?
最佳答案
你走对了路提示:迭代后公式会发生什么变化?