灵感来源
- 保持更新,努力学习
- python脚本学习
环形链表
解题思路
环形链表问题是判断一个链表中是否存在环。有两种主要解法:
-
哈希表法
- 思路:遍历链表时用哈希表记录每个节点的引用。若当前节点已在哈希表中,说明存在环。
- 复杂度:时间复杂度 O(n),空间复杂度 O(n)。
-
快慢指针法(Floyd 判圈算法)
- 思路:使用两个指针,慢指针每次移动一步,快指针每次移动两步。若存在环,快指针最终会追上慢指针;否则快指针会到达链表尾部。
- 复杂度:时间复杂度 O(n),空间复杂度 O(1),为最优解。
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def hasCycle(self, head: Optional[ListNode]) -> bool: slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return False
逐行解释
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
# 初始化快慢指针,均指向链表头节点
slow = fast = head
# 循环条件:快指针和快指针的下一个节点都不为空
# 确保快指针能安全地向后移动两步
while fast and fast.next:
# 慢指针每次移动一步
slow = slow.next
# 快指针每次移动两步
fast = fast.next.next
# 若快慢指针相遇,说明存在环
if slow == fast:
return True
# 若快指针到达链表尾部(fast或fast.next为空),说明无环
return False