logo

Leetcode 142. Linked List Cycle II 题目解析与答案

作者:c4t2024.02.04 14:22浏览量:5

简介:在Leetcode 142中,我们被要求找到链表中是否有循环,并返回链表的起始节点。下面我将详细解释如何解决这个问题,并给出代码示例。

首先,我们需要理解这个问题的本质。给定一个链表,我们需要判断它是否有循环,并返回循环的起始节点。这个问题可以通过Floyd的循环查找算法(也称为“乌龟和兔子”算法)来解决。
Floyd的循环查找算法使用了两个指针,一个快指针和一个慢指针。快指针每次移动两步,慢指针每次移动一步。如果链表中存在循环,那么快指针和慢指针最终会在某个节点上相遇。一旦它们相遇,我们可以重新设置慢指针为链表的头节点,然后同时以相同的速度移动两个指针。当它们再次相遇时,相遇点就是循环的起始节点。
下面是一个Python的实现示例:

  1. class ListNode:
  2. def __init__(self, x):
  3. self.val = x
  4. self.next = None
  5. def detectCycle(head):
  6. slow = head
  7. fast = head
  8. # 判断是否存在循环
  9. while fast and fast.next:
  10. slow = slow.next
  11. fast = fast.next.next
  12. if slow == fast:
  13. break
  14. else:
  15. # 如果不存在循环,返回None
  16. return None
  17. # 找到循环的起始节点
  18. ptr1 = head
  19. ptr2 = slow
  20. while ptr2 != ptr1:
  21. ptr1 = ptr1.next
  22. ptr2 = ptr2.next
  23. return ptr1

在这个实现中,我们首先创建了两个指针,slowfast,并将它们都设置为链表的头节点。然后,我们进入一个循环,在每个循环迭代中,slow指针移动一步,而fast指针移动两步。如果链表中存在循环,slowfast指针最终会在某个节点上相遇。一旦它们相遇,我们就退出循环。然后,我们重新设置slow指针为链表的头节点,并同时移动slowfast指针,直到它们再次相遇。相遇点就是循环的起始节点。如果链表中不存在循环,那么fast指针将到达链表的末尾,此时我们可以返回None。
这个算法的时间复杂度是O(n),其中n是链表的长度。这是因为无论是存在循环还是不存在循环,我们都需要遍历整个链表一次。空间复杂度是O(1),因为我们只使用了常数额外空间。

相关文章推荐

发表评论