返回

LeetCode 141:环形链表的进阶指南

闲谈

前言

在 LeetCode 的编码挑战中,环形链表是一个常见的难题。解决这个问题需要对链表数据结构有深入的理解和敏锐的算法思维。本文将深入探讨 LeetCode 141 环形链表问题,提供分步指南和优化技巧,帮助你掌握检测环形链表的精髓。

算法

检测环形链表的算法主要有两种:

  1. 快慢指针法 :使用两个指针,一个步长为 1,另一个步长为 2,如果链表存在环,快指针最终将追上慢指针。

  2. 哈希表法 :遍历链表并使用哈希表存储每个节点。如果遇到一个已经存在于哈希表中的节点,则说明存在环。

分步指南

快慢指针法:

  1. 定义两个指针,slowfast,分别指向链表头节点。
  2. 循环遍历链表,每次让 slow 前进一步,让 fast 前进两步。
  3. 如果 fast 指向 null,说明没有环。
  4. 如果 slow 追上了 fast,说明存在环。

哈希表法:

  1. 定义一个哈希表 visited
  2. 遍历链表,对于每个节点,检查它是否已经在 visited 中。
  3. 如果节点已经在 visited 中,说明存在环。
  4. 否则,将节点添加到 visited 中。

优化技巧

  • 避免使用额外空间 :快慢指针法不需要额外的空间,而哈希表法需要存储哈希表。
  • 充分利用短路求值 :在快慢指针法中,当 fast 指向 null 时,可以直接返回 false,而不需要继续循环。
  • 考虑边界情况 :处理链表为空或只包含一个节点的情况。

示例代码

快慢指针法:

def has_cycle(head):
    if not head or not head.next:
        return False

    slow = head
    fast = head.next

    while slow != fast:
        if not fast or not fast.next:
            return False

        slow = slow.next
        fast = fast.next.next

    return True

哈希表法:

def has_cycle(head):
    if not head:
        return False

    visited = set()

    curr = head

    while curr:
        if curr in visited:
            return True
        else:
            visited.add(curr)

        curr = curr.next

    return False

总结

LeetCode 141 环形链表问题是一个经典的算法难题,掌握其解决方法对于提升算法技能至关重要。快慢指针法和哈希表法提供了两种高效的检测环形链表的方法,充分理解算法原理并灵活运用优化技巧将使你在解决此类问题时如鱼得水。通过持续练习和深入探索,你将在算法编码的道路上不断进步。