题目
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。
示例1 :
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例2 :
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例3 :
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
自己的想法
算法实现
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not (head and head.next):
return False
slow = head
fast = head.next
while fast.next and fast.next.next:
if slow == fast:
return True
slow = slow.next
fast = fast.next.next
return False
执行结果
执行结果 : 通过
执行用时 : 52 ms, 在所有 Python3 提交中击败了77.58%的用户
内存消耗 : 16.8 MB, 在所有 Python3 提交中击败了19.14%的用户
复杂度分析
-
时间复杂度:O(n),
我们只遍历了包含有 n 个元素的列表一次。 -
空间复杂度:O(1)
哈希表法
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if head == None:
return False
target = {head}
head = head.next
while head:
if head in target:
return True
else:
target.add(head)
head = head.next
return False
执行结果
复杂度分析
-
时间复杂度:O(n),
我们只遍历了包含有 n 个元素的链表一次。 -
空间复杂度:O(n),
所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。
小结
先按照自己的想法设计,用快慢指针的方法,当快指针和慢指针相遇时,说明有环,否则快指针会到达尾部从而跳出循环。之后学习了哈希表法,通过建立字典,一边遍历链表,一边查找并将节点加入字典中,由于哈希表查找时间复杂度低,所以会快很多。