题目

题目地址:

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

题目描述:

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

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

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
LeetCode141:环形链表 - 图1

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

LeetCode141:环形链表 - 图2

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

LeetCode141:环形链表 - 图3

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

相关题目

思路

快慢指针

代码

测试用例

  • 无环链表
  • 有环链表
  • 空链表

程序

哈希表

时间空间复杂度均为 O(n)

注意比较的时候不能对链表值进行比较,因为链表值可能存在相同的情况

  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

快慢指针

时间复杂度 LeetCode141:环形链表 - 图4,空间复杂度 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. low, fast = head, head
  11. while low and fast:
  12. low = low.next
  13. if fast.next: # fast 走了两步,所以要判断 fast 和 fast.next是否都为空,否则会报NoneType的异常
  14. fast = fast.next.next
  15. else:
  16. return False
  17. if low is fast:
  18. return True
  19. return False