Cycle detection

来自wrc's Wiki
跳到导航 跳到搜索

判断环路也可使用一个集合记录所有访问过的节点,当当前节点已在集合中时说明链表有环,但此方法空间复杂度为 O(n)。

Floyd 判圈法(Floyd's cycle-finding algorithm)

判断链表环路的 O(1) 空间方法。

给定两个指针,fast 和 slow。第一次遍历时 fast 每次迭代前进两步,slow 前进一步。如果 fast 可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路且一定存在一个时刻 fast 和 slow 相遇。当 slow 和 fast 第一次相遇时,将 fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。

相关题目

LeetCode 142. Linked List Cycle II

Python 解法:

def detectCycle(self, head: ListNode) -> ListNode:
    # Floyd's cycle-finding algorithm, O(1) space
    fast = slow = head
    while fast and fast.next:
        fast = fast.next.next
        slow = slow.next
        if fast is slow:
            break
    else:
        return None
    fast = head
    while fast is not slow:
        fast = fast.next
        slow = slow.next
    return fast

另见