力扣Hot100--141.环形链表
力扣Hot100–141.环形链表
要求:给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
解题思路1: 使用 哈希表 记录所有访问过的节点,检查是否重复访问
1、在遍历每个节点时,先检查它是否在集合中,然后再将其加入集合;
2、如果遍历到链表末尾,说明无环。
空间、时间复杂度都为O(n)
常见的解题思路:快慢指针法(Floyd判圈算法)
空间复杂度O(1),时间复杂度O(n)
代码1:
class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:mode_set = set()current = headwhile current:if current in mode_set:return Truemode_set.add(current)current = current.nextreturn False
代码2:
class Solution:def hasCycle(self, head: ListNode) -> bool:if not head or not head.next:return Falseslow = headfast = head.nextwhile slow != fast:if not fast or not fast.next:return Falseslow = slow.nextfast = fast.next.nextreturn True
代码3:
也是快慢指针法,只是起点一样
class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:if not head or not head.next: # 处理空链表或单节点无环的情况return Falseslow = head fast = head result = Falsewhile (fast and fast.next): slow = slow.next fast = fast.next.next if slow == fast:result = True breakreturn result