当前位置: 首页 > news >正文

python-leetcode 25.环形链表

题目:

给定一个链表的头节点head,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回True,否则,返回False

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点

方法一:哈希表

遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过

具体使用哈希表来存储访问过的节点,每次到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表。重复这一过程,直到遍历完整个链表。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        seen=set()  #集合用来存储链表中已经存在的节点
        while head:
            if head in seen:
                return True #如果当前节点在 seen 集合中,说明该节点是重复出现的,表明链表中存在环
            seen.add(head)  #如果当前节点不在 seen 集合中,就将该节点加入 seen,并继续遍历链表
            head=head.next  #将 head 指向下一个节点,继续循环
        return False

时间复杂度:O(N)最坏情况下需要遍历每个节点一次

空间复杂度:O(N)哈希表的开销


方法二:快慢指针

定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。

使用while循环,循环条件先于循环体。由于循环条件是判断快慢指针是否重合,如果将指针初始都置于head,那么while循环就不会执行。因此,可以假想一个head之前的虚拟节点,慢指针从虚拟节点移动一步到达head,快指针从虚拟节点移动两步到达head.next,这样可以使用while循环。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head or not head.next: #检查链表是否为空,或者链表是否只有一个节点
            return False
        slow=head  #从链表的头节点开始
        fast=head.next  #从头节点的下一个节点开始
        while slow !=fast:  #如果链表中没有环,slow 和 fast 会最终分别到达链表的末尾并停止循环
            if not fast or not fast.next:  #链表的末尾,表明链表没有环
                return False

            slow=slow.next
            fast=fast.next.next
        return True

时间复杂度:O(N)遍历链表

空间复杂度:O(1)

相关文章:

  • 番外03:前端面试八股文-javaScript
  • 服务器防护(ubuntu)
  • 数据结构(6)
  • 华象新闻 | 2月20日前谨慎升级 PostgreSQL 版本
  • 初阶c语言(练习题,猜随机数,关机程序)
  • bash shell笔记——循环结构
  • 业务开发 | 基础知识 | Maven 快速入门
  • AWS助力AI智能扫地机器人马来西亚项目技术解析与成本优化实践
  • 【工业场景】用YOLOv8实现火灾识别
  • Docker 的打包及基本使用
  • 力扣-二叉树-257 二叉树的所有路径
  • LKT4202UGM新一代安全认证加密芯片,守护联网设备和服务安全
  • 小结:OSPF的网络类型,LSA
  • 扣子工作流中禁止同类别的图像流节点,不能超过4个
  • R语言学习计划启动
  • 14、deepseek视觉大模型Janus Pro本地部署及实战
  • 【AI系列】从零开始学习大模型GPT (2)- Build a Large Language Model (From Scratch)
  • C# ASP.NET的未来发展趋势
  • ElasticSearch基础和使用
  • SOUI基于Zint生成Code 2 of 5码
  • 人民日报和音:汇聚和平与发展的全球南方力量
  • 美国多地爆发集会抗议特朗普政府多项政策
  • 魔都眼|西岸国际咖啡生活节:连接艺术、音乐与宠物
  • 融创服务全面退出彰泰服务集团:约8.26亿元出售广西彰泰融创智慧80%股权
  • 王毅:为改革完善全球治理作出金砖贡献
  • 三位成功女性,如何应对失败