python-leetcode 26.环形链表II

ops/2025/2/12 6:04:49/

题目:

给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表五环,则返回null

如果链表中有某个节点,可以通过连续跟踪next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果 pos 是 -1,则在该链表中没有环。

不允许修改链表

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

方法一:哈希表

遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""pos=headseen=set()  #集合用来存储链表中已经存在的节点while pos:if pos in seen:return pos #如果当前节点在 seen 集合中,说明该节点是重复出现的,表明链表中存在环seen.add(pos)  #如果当前节点不在 seen 集合中,就将该节点加入 seen,并继续遍历链表pos=pos.next  #将 head 指向下一个节点,继续循环return None

时间复杂度:O(N)

空间复杂度:O(N)


方法二:快慢指针

使用两个指针,fast 与 slow。它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而 fast 指针向后移动两个位置。如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。

设链表中环外部分的长度为 a。slow 指针进入环后,又走了 b 的距离与 fast 相遇。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为 a+n(b+c)+b=a+(n+1)b+nc。

fast 指针走过的距离都为 slow 指针的 2 倍。因此,有a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)
有了 a=c+(n−1)(b+c) 的等量关系,发现:从相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离。力扣官方题解

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""if head is None: #检查链表是否为空return Noneslow=headfast=headwhile fast and fast.next:slow=slow.next  #每次向前移动一个节点fast=fast.next.next #每次向前移动两个节点if slow==fast:  #说明链表中存在环ptr=head  #新指针从头节点开始,同时slow 从相遇点开始,两个指针每次都向前移动一个节点,直到它们相遇。相遇的位置就是环的起始节点while ptr !=slow:ptr=ptr.nextslow=slow.nextreturn ptrreturn None

时间复杂度:O(N)在最初判断快慢指针是否相遇时,slow 指针走过的距离不会超过链表的总长度;随后寻找入环点时,走过的距离也不会超过链表的总长度。因此,总的执行时间为 O(N)+O(N)=O(N)。

空间复杂度:O(1)只用了ptr,slow,fast三个指针


http://www.ppmy.cn/ops/157707.html

相关文章

VUE 解决若依出现Error: Cannot find module ‘@/views/xxx‘问题

VUE 解决若依出现Error: Cannot find module ‘/views/xxx‘问题 Error: Cannot find module ‘/views/xxx‘问题 Error: Cannot find module ‘/views/xxx‘问题 vue 版菜单点不开,报错:Error: Cannot find module ‘/views/xxx’ 。后台、vue前端启动…

数据结构与算法

目录 一、数据结构概述 1.数据结构分为:数据的逻辑结构、数据的物理结构 🧠 ⑴.逻辑结构:数据关系的抽象模型 ①. 集合结构 ②. 线性结构 ③. 树形结构 ④. 图状结构 💾 ⑵.物理结构:数据存储的实体实现 ①. 顺序存储 ②. 链式存储 ③. 散列存储 🔍2.逻辑…

redis底层数据结构——链表

文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力,以及顺序性的节点访间方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有…

Rust 测试组织指南:单元测试与集成测试

一、为什么要同时使用单元测试与集成测试 单元测试:更为精细、聚焦某一逻辑单元;可以调用到私有函数,快速定位错误根源。集成测试:作为“外部代码”来使用库的公开接口,测试多个模块间的交互,确保整体功能…

ffmpeg -hwaccels

1. ffmpeg -hwaccels -loglevel quiet 显示ffmpeg支持的硬件设备 2. 输出 Hardware acceleration methods: vdpau cuda vaapi qsv drm opencl 3. 说明 输出中的cuda表示ffmpeg支持Nvidia 硬件设备。编译ffmpeg增加相关硬件设备的配置,输出会显示相应的信…

pycharm ai插件

PyCharm中的AI插件为开发者提供了强大的智能辅助功能,这些插件能够显著提升编码效率、优化代码质量,并提供实时的编程建议和帮助。以下是一些主要的PyCharm AI插件及其功能介绍: 一、CodeMoss(ChatGPT Free) 简介:CodeMoss是一款集成在PyCharm内的顶级AI插件,全称“Cha…

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型,也提供了 API(接口)调用方式。据 DeepSeek介绍,DeepSeek-R1 后训练阶段大规模使用了强化学习技术,在只有极少标注数据的情况下提升了模型推理能力,该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…

React Vite 项目增加 eslint 和 prettier

React Vite 项目增加 eslint 和 prettier Eslint 版本为 8.X 1. 安装 8.X 版本的 eslint pnpm i eslint^8.57.0 -D 2. 安装其他包 pnpm add -D eslint-plugin-import prettier eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-prettier eslint-config-pre…