题目描述
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)的空间复杂度下解决问题。
快慢指针对于链表问题有很多特殊的快速解法:
- 使用快慢指针来找到链表的中点234.Palindrome Linked List
- 链表的翻转143. Reorder List
- 链表的环问题(即本体)以及环的入口142 Linked List Cycle
接下来几天我将把这几题详细地写出题解形成个链表的小专题。