题目描述
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 = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
fast, slow = ListNode(0), ListNode(0)
fast.next = head
slow.next = head
while fast:
if not fast.next: return False
fast = fast.next.next
slow = slow.next
if fast == slow:
return True
解法二:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
visited = set()
dummy = ListNode(0)
dummy.next = head
while head:
if not head in visited:
visited.add(head)
head=head.next
else:
return True
return 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
接下来几天我将把这几题详细地写出题解形成个链表的小专题。