因此,我最近遇到了一种算法来确定链表中是否存在循环。代码如下:

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”,从而使上述方程是可解的呢?

最佳答案

你走对了路提示:迭代后公式会发生什么变化?

10-04 21:54