一、题目描述
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 如果链表中存在环,则返回 true 。 否则,返回 false 。
二、方法一
我们使用快慢指针解决此问题
PS:快慢指针是指两个指针一块一慢,用此制造出我们想要的差值,通过差值进而找到链表上相应的节点
代码如下:
def Cycle(head: ListNode):
if not head and not head.next:#是否头结点为空
return False #返回FALSE
fast = head.next #快指针
slow = head #慢指针
while fast != slow: #是否快慢指针相遇 相遇则证明链表中有环
if not fast.next and not fast.next.next: #如果快指针指空
return False #说明链表走到结尾 无环 返回FALSE
fast = fast.next.next #快指针移动
slow = slow.next #慢指针移动
return True
三、方法二
我们使用哈希表解决此问题
PS:将访问过的节点存入哈希表,每访问一个节点,则判断该节点是否存于哈希表中。如果已经存于哈希表中则说明该表是环形链表,否则加入哈希表中。重复遍历完链表即可
PS:set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
代码如下:
def Cycle(head:ListNode):
counter = set()
while head:
if head in counter:
return True
counter.add(head)
head = head.next
return False
四、复杂度分析
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
快慢指针 | O(N) | O(1) |
哈希表 | O(N) | O(N) |