leetcode 142.环形链表2

2023-11-19

leetcode 142.环形链表2
给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos  -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出: 返回索引为 1 的链表节点
解释: 链表中有一个环,其尾部连接到第二个节点。
由题意可知,我们需要先判断链表是否有环,再判断进入环的第一个节点位置
1.如何判断链表有环
可以采取快慢指针的方法,两个指针都从头节点开始,只要链表中有环,那么快指针一定会和慢指针相遇     
如果快指针可以走到链表尽头,则说明链表不是环形链表
2.如何判断进入环第一个节点的位置
        我们可以将头节点到第一个环节点的长度记作a,环节点到快慢指针相遇的节点长度记作b
剩下一部分环节点的长度记作c
        当快慢指针相遇的时候 fast指针所走过的距离=a+n(b+c)+b,slow指针走过的距离=a+b     
这里需要解释一下为什么slow指针一定是在进入环的第一圈就会和fast指针相遇,其实很好理解,(后面说的都是已经进入环中所走的距离)因为我们所设置的fast指针一次走两个节点,slow指针一次走一个节点,且fast指针一定比slow指针先进入环中,此时可看成是一个简单的追及问题,我们不妨假设最坏的情况,slow指针在环中刚好走了一圈,也就是b+c的距离时,fast指针走了2(b+c)+先进入环中的距离,两个距离相减可得fast指针比slow指针多走了b+c+先进入环中的距离,此时fast指针一定已经追上了slow指针
        由上述的分析我们可以得到一个等式:a+n(b+c)+b=2(a+b),解得:a=(n-1)(b+c)+c
        也就意味着a的长度等于n-1个环的长度+c段部分的长度,所以如果我们 从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点
python代码:
class Solution:
    def detectCycle(self, head):
        slow, fast = head, head
        while fast !=None and fast.next !=None:#当fast指针指不到空节点说明有环
            slow = slow.next
            fast = fast.next.next
            if slow == fast:#此时快慢指针相遇
                p = head
                q = slow
                while p!=q:#从head节点和相遇节点再分别出发
                    p = p.next
                    q = q.next
                return p#返回p,q均可
        return None#没有环时
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 142.环形链表2 的相关文章

随机推荐

  • CUDA各版本官方下载地址

    一 CUDA各版本官方下载地址 地址 https developer nvidia com cuda toolkit archive 二 说明 备忘 平时找个版本太难找了 转载于 https www cnblogs com songxing
  • Vue2 + 高德地图API 获取用户当前位置等信息,错误default.CitySearch is not a Constructor的应对

    效果 高德地图API参考手册 控制台输出信息 代码 public index html 使用CDN引入高德地图API
  • SQL--查询结果最后加合计行

    union all 是一种 SQL 操作符 用于将两个或多个 SELECT 语句的结果集合并成一个结果集 与 union 不同的是 union all 不会去重 即会保留重复的行 使用 union all 可以方便地将多个表或查询结果合并成
  • 计算机二级【C语言】-复习使用

    文章目录 第一章 C语言概述 1 1 C语言基础知识 1 23题 1 2 常量 变量和数据类型 24 73题 第二章 运算符与表达式 2 1 C语言运算符简介 74 79题 2 2 算术运算符和算数表达式 80 99题 2 3 赋值运算符和
  • Docker环境安装

    安装Docker 开启Docker服务 查看安装结果 设置开机启动 配置Docker镜像下载加速
  • 【第42篇】MicroNet:以极低的 FLOP 实现图像识别

    文章目录 摘要 一 简介 二 相关工作 三 我们的方法 MicroNet 3 1 设计原则 3 2 Micro Factorized 卷积 3 3 动态 Shift Max 3 4 与先前工作的关系 四 MicroNet 架构 五 实验 I
  • JWT解析库-nimbus-jose-jwt

    JWT解析库 nimbus jose jwt nimbus jose jwt 使用他可以生成或者解析对称加密或者非对称加密的的JWT JWS是JWT规范的落地实现 1 依赖 1 1 pom依赖
  • 深夜好文

    题图 https unsplash com oldskool2016 无论项目中还是面试都离不开装饰器话题 装饰器的强大在于它能够在不修改原有业务逻辑的情况下对代码进行扩展 权限校验 用户认证 日志记录 性能测试 事务处理 缓存等都是装饰器
  • 时间复杂度常见算法

    常见时间复杂度对应算法 注 if的时间复杂度为O 1 一层for循环时间复杂度为O n 两次for循环时间复杂度为O n 一个算法中有多个for 但都是单层for 时间复杂度为O n
  • C语言 每日一题

    C语言 每日一题 9 13 9 19 9月13日 星期一 题目一 有1 2 3 4个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 题目二 输入一个int型整数 按照从右向左的阅读顺序 返回一个不含重复数字的新的整数 保证输入的整
  • Navicat导入Excel数据顺序变了

    项目场景 Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中 但是 在导入的过程中 我们常会发现数据顺序出现了问题 导致数据错位 给数据的处理带来了极大的麻烦 原因分析 这个问题的出现是由于数据库的默认排序规则
  • Jina AI 两周年

    文章导读 2 月是 Jina AI 的生日月 全球各地 Office 用妙趣横生的在线游戏 以及美味的食物 欢快的合照 共同为 Jina AI 庆生 2020 年 2 月 新冠病毒开始肆虐全球 世界各地都逐步进入抗疫紧急状态中 几乎在同一时
  • 【Python】WARNING: Ignoring invalid distribution -ip (c:\python39\lib\site-packages)

    问题描述 在Win10命令行中使用pip命令出现警告信息 WARNING Ignoring invalid distribution ip c python39 lib site packages 解决方案 进入警告信息中报错的目录 c p
  • MyISAM和InnoDB

    1 MyISAM 默认表类型 它是基于传统的ISAM类型 ISAM是Indexed Sequential Access Method 有索引的顺序访问方法 的缩写 它是存储记录和文件的标准方法 不是事务安全的 而且不支持外键 如果执行大量的
  • 8.3雾

    先上图 其实很简单 就是光照和雾的系数插值 雾出现在与摄像机的一定距离 在这个距离内 没雾 在这个距离外 越远雾越大 即雾的系数从0到1 光照系数从1到0 在shader中 代码如下 cbuffer cbFixed float gFogSt
  • 安川服务器输入输出信号,最全PLC输入输出各种回路接线!

    原标题 最全PLC输入输出各种回路接线 一 输入回路接线 输入电路是PLC接收信号的端口 对模拟量来说一般为0 40MA直流电流或0 10V直流电压信号 输入接线是指外部输入器件 任何无源的触点和集电极开路的NPN三极管 接通输入回路闭合
  • Nginx双机主备(Keepalived实现)

    前言 首先介绍一下Keepalived 它是一个高性能的服务器高可用或热备解决方案 起初是专为LVS负载均衡软件设计的 Keepalived主要来防止服务器单点故障的发生问题 可以通过其与Nginx的配合实现web服务端的高可用 Keepa
  • 截取鼠标指针的图片

    Windows下的鼠标经常会显示出不同的样子以提示当前的操作 所以对于很多程序来说截取鼠标指针当前的图片并进行分析是很有用处的 下面分析两种截取鼠标指针的图片的方法并给出一个示范程序 截取鼠标指针的图片首先要取得鼠标的句柄 然后用API函数
  • ESP32学习笔记05-串口事件方式读取数据

    串口中断方式处理数据 事件机构体 typedef struct uart event type t type lt UART event type size t size lt UART data size for UART DATA ev
  • leetcode 142.环形链表2

    leetcode 142 环形链表2 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测