问题

https://leetcode-cn.com/problems/linked-list-cycle/

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。

LeetCode:141. 环形链表 - 图1

示例 2:

输入:head = [1,2], pos = 0

输出:true

解释:链表中有一个环,其尾部连接到第一个节点。

LeetCode:141. 环形链表 - 图2

示例 3:

输入:head = [1], pos = -1

输出:false

解释:链表中没有环。

LeetCode:141. 环形链表 - 图3

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

思路

走一圈,用一个列表来记录走过的 节点

快慢指针

快慢指针

程序

走一圈,用一个列表来记录走过的 节点

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def hasCycle(self, head: ListNode) -> bool:
  8. if not head:
  9. return None
  10. temp_list = []
  11. while head:
  12. if head in temp_list:
  13. return True
  14. temp_list.append(head)
  15. head = head.next
  16. return False

快慢指针(有环必定会相遇)

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def hasCycle(self, head: ListNode) -> bool:
  8. if not head:
  9. return False
  10. dummy = ListNode(0)
  11. dummy.next = head
  12. low = dummy
  13. fast = dummy
  14. while fast and fast.next:
  15. low = low.next
  16. fast = fast.next.next
  17. if low is fast:
  18. return True
  19. return False