力扣刷题TOP101:6.BM7 链表中环的入口结点
目录:
目的
思路
复杂度
记忆秘诀
python代码
目的
{1,2},{3,4,5}, 3 是环入口。

思路
这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑(Floyd 判圈算法)的延续版:乌龟愤愤不平地举报兔子跑得太快,偷偷回头朝自己炫耀得瑟,还说在环口撒了尿标记。裁判接到举报,准备调取“监控记录”,验证兔子是否偷偷回头,并定位撒标记的位置(环入口)。
裁判开始审理过程:
-
参赛选手:
- 乌龟(慢指针slow): 每次只走一步,慢悠悠的。slow = head
- 兔子(快指针fast): 从同样的起点出发,每次跳两步,永远快人一步。fast = head
- 观察双方起点位置,从同样的起点出发
比赛规则:
只要兔子还没跑出链表(
fast != None且fast.next != None),比赛继续。
- 为什么检查两个条件?
fast: 如果fast == None,说明兔子已经跑到了链表的尽头,没有环。fast.next: 是兔子跳两步时需要访问的下一个节点。fast.next == None,说明兔子已经没有“下一步”可以跳,也意味着链表没有环。
比赛开始:
- 乌龟稳步前进: 走一步,代表慢速slow = slow.next。
- 兔子飞速跳跃: 跳两步,代表快速移动fast = fast.next.next。
- 是否龟兔同镜(相遇点): 如果他们在一个镜头中出现(
slow == fast),裁判记录兔子回头了,继续调查。如果没有出现(环),直接结束,乌龟举报无效,返回None。 - 为什么一定会相遇?
- 如果链表是闭环,兔子因为步伐更快,最终会在环内兜圈,追上乌龟。
寻找兔子撒尿点(环口):
裁判让乌龟回到起点:
- 乌龟回到起点,准备和兔子一同慢跑:
slow = pHead。兔子在相遇点陪乌龟慢慢走:
- 这次双方步伐一致,每次只走一步:
slow = slow.nextfast = fast.next两者最终相遇(具体可查看下面详细的数学推导):
- 当两者再次相遇时
slow == fast,位置就是环的入口节点,也就是兔子撒尿炫耀的地方。
举报成功:
- 裁判员找到了兔子撒尿标记的地方(环的入口节点)并提交结果return slow,乌龟举报成功,取消兔子的比赛成绩。
复杂度
-
时间复杂度:O(n)
- 每次兔子和乌龟各走一段路,总路程不会超过链表长度的两倍。
-
空间复杂度:O(1)
- 只用了两只小动物(两个指针变量),省吃俭用,不多花内存。
记忆秘诀
- 乌龟走一步,兔子跳两步。
- 链表有环,相遇无误。
- 链表无环,兔子先停步。
- 环点未锁住,乌龟再起步
- 兔子陪跑步,入口终汇聚
补充:数学推导
设链表为一个带环的结构,其中:
- a:链表头节点到环入口的距离(环前的直线段)。
- b:环入口到相遇点的距离(在环中的第一部分)。
- c:相遇点到环入口的剩余距离(环中的第二部分)。
- n:兔子绕环的圈数。
-
兔子的距离是乌龟的两倍:
2(a+b)=a+b+n(b+c)- 兔子每次跳两步,乌龟每次走一步,因此兔子走的距离总是乌龟的两倍。
-
化简公式:消去公共项 a+b,得到:a=c+(n−1)(b+c)
-
乌龟的距离:当乌龟从起点走 a距离时,会刚好到达环的入口。
-
兔子的距离:兔子从相遇点出发,绕过 c距离后也会到达环的入口。
-
同步抵达环入口:因为 n−1表示兔子可能多绕了若干圈,但最终兔子和乌龟都会同时抵达环入口。
-
-
找到环入口的核心原因:
- 相遇后,将乌龟放回起点,兔子留在相遇点。
- 两者按相同速度行进(每次一步),兔子绕过剩余的 c 距离时,乌龟正好走完 a,两者在环入口相遇。
python代码
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:def EntryNodeOfLoop(self, pHead: ListNode) -> ListNode:# 快慢指针法:检测环slow = pHeadfast = pHead# 检测是否有环while fast and fast.next:slow = slow.nextfast = fast.next.nextif slow == fast: # 快慢指针相遇,说明有环breakelse:return None # 如果没有环,返回 None# 重新开始寻找环的入口slow = pHead # 慢指针重新指向头节点while slow != fast:slow = slow.nextfast = fast.next # 两个指针每次都走一步# 相遇时即为环的入口return slow
* 欢迎大家探讨新思路,能够更好的理解和记忆
相关文章:
力扣刷题TOP101:6.BM7 链表中环的入口结点
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑(Floyd 判圈算法)的延续版:乌龟愤愤不平地举报兔子跑得太快,偷偷…...
浅谈telnet和ping
telnet 和 ping 是网络诊断工具,用于测试网络连接性和故障排查,但它们有不同的用途和功能。以下是它们的主要区别: 1. ping 功能描述 用途:ping 命令用于测试主机与目标地址(IP或域名)之间的连通性。工作…...
P4-3【应用数组进行程序设计 | 第三节】——知识要点:字符数组
知识要点:字符数组 视频: P4-3【应用数组进行程序设计 | 第三节】——知识要点:字符数组 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 本任务要求输入一行字符,统计其中的单词数,单词之间用…...
彻底理解微服务配置中心的作用
常见的配置中心有SpringCloudConfig、Apollo、Nacos等,理解它的作用,无非两点,一是配置中心能做什么,不使用配置中心会出现什么问题。 作用:配置中心是用来集中管理服务的配置,它是用来提高系统配置的维护…...
SpringBoot开发——详细讲解 Spring Boot 项目中的 POM 配置
文章目录 一、POM 文件简介二、单模块项目的 POM 配置1. 创建基本的 Spring Boot 单模块项目2. 重点解析三、多模块项目的 POM 配置1. 多模块项目结构2. 父模块 POM 文件3. 子模块 POM 文件4. 重点解析结语在 Spring Boot 项目中,POM(Project Object Model)文件起着关键作用…...
pyspark实现基于协同过滤的电影推荐系统
最近在学一门大数据的课,课程要求很开放,任意做一个大数据相关的项目即可,不知道为什么我就想到推荐算法,一直到着手要做之前还没有新的更好的来代替,那就这个吧。 推荐算法 推荐算法的发展由来已久,但和…...
视觉语言模型(VLM)学习笔记
目录 应用场景举例 VLM 的总体架构包括: 深度解析:图像编码器的实现 图像编码器:视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑:你输入 “生成一张…...
学习笔记:黑马程序员JavaWeb开发教程(2024.11.29)
10.5 案例-部门管理-新增 如何接收来自前端的数据: 接收到json数据之后,利用RequestBody注解,将前端响应回来的json格式的数据封装到实体类中 对代码中Controller层的优化 发现路径中都有/depts,可以将每个方法对应请求路径中的…...
文档加密怎么做才安全?
公司的文档包含很多机密文件,这些文件不仅关乎公司的核心竞争力,还涉及到客户隐私、商业策略等敏感信息。因此,文档的保管和传递一直是我们工作的重中之重。 为了确保机密文件的安全,公司需要制定了一系列严格的保密措施。从文件的…...
使用Setup Factory将C#的程序打包成安装包
一、软件下载 https://download.csdn.net/download/qq_65356682/90042701 可以直接下载 二、软件使用 打开 1、创建一个新的项目 2、设置如下信息,也可以不设置,最好填非空的、 产品名就是你安装成功后生成文件的名称 3、如下文件夹路径就是你C#中ex…...
解决 java -jar 报错:xxx.jar 中没有主清单属性
问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误: xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息,Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…...
Java HashSet 介绍
怀旧网个人博客网站地址:怀旧网,博客详情:Java HashSet 介绍 哈希值介绍 创建一个实体类 public class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;} }使用测试…...
2024年几款免费的AI对话工具介绍
目前几款免费的AI对话工具介绍 文章目录 目前几款免费的AI对话工具介绍一、前言二、AI对话工具介绍1、讯飞星火认知大模型2、百度文心一言3、通义千问4、豆包5、百川大模型6、智谱清言7、月子暗面-KIMI下面是国外的 AI 对话工具: 8、Replika8、Cleverbot9、Coze 三、…...
Gazebo构建模型(含GNSS、IMU、LiDAR、Camera传感器)
将GNSS、IMU、LiDAR、Camera传感器和机器人的base分别放在不同的文件中。这样可以提高模型的可维护性和模块化。下面是一个示例,展示如何将这些部分分别放在不同的.xacro文件中,然后通过导入的方式组合在一起。 1. 创建基础文件:my_robot.xa…...
#Js篇: 链式判断运算符 ?.和Null判断运算符 ??和逻辑赋值运算符||= = ??=
链式判断运算符 ?. ?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。 链判断运算符?.有三种写法。 obj?.prop // 对象属性是否存在 obj?.[expr] // 同上…...
IDEA敲Web前端快捷键
1.html基础格式 英文符号TAB键 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, mini…...
【Vue3】【Naive UI】<NDropdown>标签
【Vue3】【Naive UI】 标签 基本设置自定义渲染交互事件其他属性 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 【VUE3】【Naive UI】<…...
技术总结(四十一)
一、MySQL 索引概述 索引的概念:索引就好比一本书的目录,它能帮助 MySQL 快速定位到表中的数据行,而不用全表扫描。通过创建合适的索引,可以大大提高查询的效率。例如,在一个存储了大量员工信息的表中,如果…...
Android布局
一、线性布局 属性:orientation vertical horizontal layout_weight【水平均分,width"0dp"】 layout_height layout_width 小动物连连看 1<?xml version"1.0" encoding"utf-8"?>2<LinearLayout xmlns:and…...
k8s集成skywalking
如果能科学上网的话,安装应该不难,如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容,对于目前大部分采用微服务架构的公司来说,分布式链路追踪都是必备的,无论它是传统微服务体系亦或是新一代…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
