AI智能
改变未来

100天精刷LeetCode-Day5:141 Linked List Cycle问题(附详细思路和python题解)


题目描述

Given a linked list, determine if it has a cycle in it.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed)in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

思路

  • 解法一:如果有cycle,那么可以构造一个快指针一个慢指针,早晚会快指针会绕着环追上慢指针。所以当快指针==慢指针的时候就return True
  • 解法二:也可以用HashTable的方法去解决,每一个没见过的Node都存到一个set里面,如果head.next是set内的元素,那么就return True,反之一直到head.next==None还没有重复那么就没有环。

代码

解法一:

# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:fast, slow = ListNode(0), ListNode(0)fast.next = headslow.next = headwhile fast:if not fast.next: return Falsefast = fast.next.nextslow = slow.nextif fast == slow:return True

解法二:

# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:visited = set()dummy = ListNode(0)dummy.next = headwhile head:if not head in visited:visited.add(head)head=head.nextelse:return Truereturn False

分析

解法一:

  • 时间复杂度O(n)O(n)O(n)
  • 空间复杂度O(1)O(1)O(1)

解法二:

  • 时间复杂度O(n)O(n)O(n)
  • 空间复杂度O(n)O(n)O(n)

思考

这道题是第一次碰到快慢指针的题目。它相对的优势就是能在O(1)O(1)O(1)的空间复杂度下解决问题。
快慢指针对于链表问题有很多特殊的快速解法:

  1. 使用快慢指针来找到链表的中点234.Palindrome Linked List
  2. 链表的翻转143. Reorder List
  3. 链表的环问题(即本体)以及环的入口142 Linked List Cycle

接下来几天我将把这几题详细地写出题解形成个链表的小专题。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 100天精刷LeetCode-Day5:141 Linked List Cycle问题(附详细思路和python题解)