LC142. 环形链表 II

news2024/11/20 6:29:24

题目大意

给你一个链表,要求判断是否有环,若有环,找出环的入口结点。

142. 环形链表 II

判断是否有环

判环比较简单,用一个一次走一个结点的快指针,和一个一次走一个结点的慢指针同时遍历链表,若两指针相遇则链表有环,若两指针有一遇到NULL则无环。重点在于如何找到环的入口结点。

找环的入口结点

解法一:Hash+遍历

用一个指针遍历链表,将经过的所有结点都加入hashmap中,遇到重复的结点即为有环,且环入口结点就是该重复结点。代码略。

解法二:快慢指针

快慢指针的解法相同,但是推导或者说证明的思路会有差异。

思路一

代码随想录里的思路,也是常规证明思路,视频讲解:链表:6.环形链表||

思路二

我自己的推导思路,相对比较直观,但是过程比较繁琐。

设链表头结点到环入口结点的距离为x,环周长为c,快指针f,慢指针s,f一次走两个结点,s一次走一个结点。

此处我参考了直线匀速运动的追及问题。当快指针f到达环入口结点时,f刚好走了长度为x的路程,而s刚好在x/2处(f的速度是s的两倍),记此时刻为时刻一

当s到达环入口结点时,s相对于时刻一继续走了x/2,而f则是相对于时刻一在环上走了x的路程,注意,此处x可能大于环长,即f可能此时可能已经在环上走了n圈s才刚到达环入口,记此时刻为时刻二

在时刻二,s在环入口,f在环上走了x(要是c小于x怎么办?也即f在环上绕了很多圈的情况,其实并不影响,因为这个x始终说的都是追及距离,也就是f追上s要往前走的距离,毕竟f不可能倒退),即f此时在环上还没有走满一圈,那么此时f还要走 c-x 才能到达环的入口,也即此时f与s的距离为c-x(追及距离,即只考虑f往前走),类比匀速直线运动的追及问题,f的速度是s的两倍,可以推出在时刻二后,f追上s时,s在环上恰好走了c-x,记此时刻为时刻三,时刻三即为f与s相遇的时刻。

在时刻三,s与f相遇,此时相比时刻二,s在环上走了c-x,那么s还要继续往前走 c-(c-x),即x, 才能走满一圈重新到达环的入口,也就是说,到此可以推导出:f与s第一次相遇的点y,到环入口结点的距离(追及距离,只考虑指针往前走的距离)为x。

那么,接下来只要我们用一个指针指向相遇点y,一个指针指向链表头结点,将两个指针同时往前移动,当两指针相遇时,即找到环的入口结点。

证明过程中分的时刻一二三只是为了稍微严谨一些,实际上如果读者跟着文字用纸画出来理解的话这个思路很简单易懂,这个思路有一个很重要的参考是直线匀速运动的追及问题:当a的速度为b的两倍时,若a在b后方c米处,二人同时起跑,则最终b会在距离a起点处2c的距离被a追上,也即b会在跑了c米时被追上。

代码

    ListNode *detectCycle(ListNode *head) {
        if(head == NULL || head->next == NULL)return NULL;

        ListNode*f = head, *s = head;
        ListNode* met = NULL;  //指向相遇结点
        while(f && f->next){
            f = f->next->next;
            s = s->next;
            if(s == f){
                met = s;
                break;
            }
        }
        //无环
        if(met == NULL)return NULL;

        //找环入口
        s = head;
        while(s != met){
            s = s->next;
            met = met->next;
        }
        return s;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一个Three的demo实例

Three的第一个Demo 前言效果图1、导入threejs2、创建场景3、创建相机4、创建渲染器5、创建几何图形6、创建材质7、创建网格8、将网格添加到场景中9、设置相机的位置10、渲染11、整体代码 前言 创建第一个demo实例—旋转的方格 效果图 1、导入threejs import * as THREE from…

漏洞赏金猎人开源工具集合,自动辅助渗透测试工具

漏洞赏金猎人开源工具集合,自动辅助渗透测试工具。 公开收集的一个国外白帽子用的比较多的开源工具列表 这是一款半自动渗透测试的工具,当前版本多用于渗透测试的信息搜集,每周保持更新,最终的目标是类似于linpeas的全自动渗透测…

直接插入排序、希尔排序详解。及性能比较

直接插入排序、希尔排序详解。及性能比较 一、 直接插入排序1.1 插入排序原理1.2 代码实现1.3 直接插入排序特点总结 二、希尔排序 ( 缩小增量排序 )2.1 希尔排序原理2.2 代码实现2.3 希尔排序特点总结 三、直接插入排序和希尔排序性能大比拼 !!!3.1 如何对比性能?准…

4款视频号数据分析平台!

很多人在做视频号的时候就会有创作参考的需求,那么你们知道视频号中有哪些数据平台?今天就和大家来分享一下 接下来就总结一下视频号数据平台有哪些?排名不分前后。 1:视频号助手(channels.weixin.qq.com&#xff09…

旋转的正方体-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第151讲。 第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕,编程题一共有6题,分别如下&a…

C 风格文件输入/输出---错误处理---(std::clearerr,std::feof,std::ferror,std::perror)

错误处理 清除错误 std::clearerr void clearerr( std::FILE* stream ); 重置给定文件流的错误标志和 EOF 指示器。 参数 stream-要重置错误标志的文件流 返回值 &#xff08;无&#xff09; 调用示例 #include <iostream> #include <cstdio>using names…

微服务保护-降级

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

『C语言进阶』指针进阶(二)

&#x1f525;博客主页&#xff1a; 小羊失眠啦 &#x1f516;系列专栏&#xff1a; C语言 &#x1f325;️每日语录&#xff1a;上天是公平的&#xff0c;有付出就有收获 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 在上篇指针进阶中&#xff0c;我们对字符指针、指针…

计网 - 图解OSI 七层模型 和 TCP/IP 四层模型

文章目录 OSI 七层模型TCP/IP四层模型图解 OSI图解 TCP/IP小结 OSI 七层模型 OSI&#xff08;开放系统互联模型&#xff0c;Open Systems Interconnection Model&#xff09;是一个用于理解和描述计算机网络体系结构的标准化框架&#xff0c;由国际标准化组织&#xff08;ISO&…

基于Xml方式Bean的配置-beanName个别名配置

SpringBean配置详解 Bean的基础配置 例如前文涉及到的配置文件 <bean id"userService" class"com.example.Service.Impl.UserServiceImpl"/>此时存储到Spring容器&#xff08;singleObjects单例池&#xff09;中的beanName是userService&#xf…

【Java】IDEA 将 Java 项目打包成 Jar 包

在工件中添加 JAR 构建&#xff08;Build&#xff09;工件&#xff0c;JAR 包会生成在 out 目录下

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群&#xff1f;为什么要使用集群架构&#xff1f; 1.什么是集群&#xff1f;2.为什么要使用集群&#xff1f;2.1 高性能2.2 价格有效性2.3 可伸缩性2.4 高可用性2.5 透明性2.6 可管理性2.7 可编程性 3.集群的常见分类3.1 负载均衡集群3.2 高可用性集群3.3 高性能计算集…

Vue2+Vue3

文章目录 Vue快速上手Vue是什么第一个Vue程序插值表达式Vue核心特性&#xff1a;响应式 Vue指令v-htmlv-show 与 v-ifv-else 与 v-else-ifv-onv-bindv-forv-model指令修饰符 计算属性watch侦听器&#xff08;监视器&#xff09;watch——简写watch——完整写法 Vue生命周期 和 …

c语言输出杨辉三角

#include<stdio.h> int main() {int x 0; //表示杨辉三角的的大小int y 1;printf("请输入x的值: ");scanf("%d", &x);for (int i 0; i < x; i) {for (int j 0; j < i; j) {if (j 0 || i 0) {y 1;}else {y y * (i - j 1) / j;}pri…

[mockjs]-mockjs的使用

Mock主要是用于前后端分离时&#xff0c;模拟交互时的返回数据 接下来介绍一下其它几种Mock的方式 json-server 与 express 之前介绍过json-server,可以启动一个express创建的mock的服务&#xff0c;通过接口获取数据&#xff1b;json-server也可以通过命令直接启动一个json…

【深度学习】大模型卷到机器人上了

当一项变革性技术出现后&#xff0c;以此为基础的技术就会像雨后春笋般蔓延。 就像Transformer出现后&#xff0c;以此为基础的大语言模型ChatGPT&#xff0c;视觉基础模型Segment Anything相继横空出世&#xff0c;并展现出强大的涌现能力。生成式AI可谓百花齐鸣&#xff0c;…

性能测试-性能工程落地的4个阶段(21)

性能工程按照不同的内容和目的划分为4个阶段,分别是线下单系统压测分析阶段、线下全链路压测分析阶段、生产只读业务压测及容量评估阶段、生产读写业务全链路压测及容量评估阶段。(也可以理解为一个企业性能测试体系的发展阶段) 线下单系统压测分析阶段 针对单系统的性能…

那些你不得不知道的CSS知识点

目录 1、CSS的盒子模型1.1 css盒子模型有哪些&#xff1a;1.2 css盒子模型的区别1.3 通过css如何转换css盒子模型 2、css优先级3、line-height和height的区别4、如果用css画一个三角形&#xff1f;5、CSS选择符有哪些&#xff1f;哪些属性可以继承&#xff1f;6、一个盒子不给宽…

《已解决 Go Error: panic: runtime error: index out of range BUG 》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e; 猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f4a1; 后端技术 Backend: 编程语言: &#…

【计算机视觉】Image Data Augmentation算法介绍合集(二)

文章目录 一、Random Grayscale二、GridMask三、Adversarial Color Enhancement四、Population Based Augmentation五、MaxUp六、SuperpixelGridCut, SuperpixelGridMean, SuperpixelGridMix七、InstaBoost八、Random Mix-up九、Sample Redistribution十、Batchboost十一、CutB…