2025/2/27 【双指针】LeetCode 142.环形链表II
1.快慢指针法(来自代码随想录)
需要找规律,和数学式子的简单推理
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def detectCycle(self, head: Optional[ListNode]): # 设定快慢指针 slow = fast = head # slow一次移动一个节点,fast一次移动两个节点 while fast and fast.next: slow = slow.next fast = fast.next.next # 如果有环,slow和fast一定在某一点相遇 if slow == fast: # 这时从其实节点出发的指针和从相遇点出发的指针一定将在环入口相遇 slow = head while slow != fast: slow = slow.next fast = fast.next return slow # 没有环 return None
2.集合方法
还是这种方法比较容易想到,利用集合中元素不重复的性质。
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def detectCycle(self, head: Optional[ListNode]): visited = set() while head: if head in visited: return head visited.add(head) head = head.next return None