链表带环问题——leetcode环形链表1 2

证明链表带环

        链表的带环问题指的是本该指向NULL的最后一个节点指向了之前的节点,导致链表成环,找不到尾结点的情况,那么我们该如何证明链表带环呢?

我们可以类比物理中的追及问题,让快慢指针同时走,两者相遇说明有环,两者不相遇(遇见NULL)说明没有环。

那么应该怎么确保他们相遇呢,我们从快指针一次走两个单位,慢指针一次走一个单位开始,流程图如下:

最后确实是快慢指针相遇。

        如果是快指针一次走三个单位,慢指针一次走一个单位呢?是不是也可以呢?假设当慢指针进入环的时候,快慢指针的差距为N,环的长度为C。

        每迭代一次,如果快指针每次走3个单位,慢指针每次走一个单位,差距就会变成N-2,N-4,N-6,如果N是奇数,则快慢指针不会相遇,当然也有相遇的情况,如果C为奇数,会相遇,这是因为当N和C都为奇数的时候,差距N-2,N-4,最后变为-1(相当于fast指针超过slow指针一个单位),此时距离相当于是C-1(是一个偶数),也就是说,fast指针会超过slow指针一次,然后相遇。

        不过上段文字并不十分重要,如果仍然快指针一次走两个单位,慢指针一次走一个单位,那么快慢指针的距离就会是N-1,N-2,N-3,最后变为0。也就是说,如果快指针一次走两个单位,慢指针一次走一个单位,他们总会相遇并且不会存在错过的情况,是判断是否有环的理想方法。

找到环节点

        知道了如何判断链表是否有环之后,如何找到入环的节点呢?

方法 1 :

假设当快慢指针相遇的时候,相遇节点距离进入环的节点长度为N,环的周长为C,环前的单链长度为L。如图所示:

        当slow指针和fast指针相遇的时候,fast指针的路程是slow指针路程的二倍(因为fast一次走两个单位,slow一次走一个单位),表示slow慢指针的路程就是:L+N,对于快指针来说,如果L足够长,那么有可能当slow慢指针进入环之前,fast快指针就已经在环内遍历了m遍,m>1,所以fast快指针的路程是:L+m*C+N。

二倍的slow慢指针的路程等于fast快指针的路程:

最后变形得到:

        (m-1)*C相当于绕环转(m-1)圈,所以也就是说从快慢指针相遇的地方接着走(C-N)个单位(在走m-1圈,位置相当于没变)和L个单位一样,也就是进入环的节点。

        所以我们可以借助第一问先找到快慢指针的相遇节点,在让头指针走L个单位,相遇节点走C-N个单位(其实就是让他们走到相等为止),找到进入环的节点。

方法 2 :

借鉴上面的最后的思路,我们可以将环从相遇节点断开,然后找两个链表的相交节点,请看相交链表:

        在这也简单说明一下一般相交链表的思路:就是分别计算不同头指针链表的长度num1,num2,先让长的链表走 |num1-num2| 个单位,再两个链表一起走,直到找到节点。

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎评论。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

element-ui form表单自定义label的样式、内容

element-ui form表单自定义label的样式、内容 效果截图 代码 <el-form size"small" :inline"true" label-width"120px"><el-form-item prop"name"><div slot"label"><i style"color: red;"…

步步精科技获得发明型专利,提升Type-C连接器行业竞争力

在电子科技日新月异的时代&#xff0c;连接器作为电子设备中不可或缺的一部分&#xff0c;其安全性、稳定性和性能水平直接关系到设备的使用效果和用户体验。深圳市步步精科技有限公司&#xff08;以下简称“步步精科技”&#xff09;一直致力于连接器领域的技术创新和产品研发…

盒子模型之弹性盒模型

经常适用于手机端图标布局 display: flex;让这个盒子显示成弹性盒&#xff08;很适合移动端布局&#xff09; 影响&#xff1a;1.让里面的子元素默认横向排列 2.如果子元素是行内元素&#xff0c;则直接变成块元素 3.只有一个元素&#xff0c;margin: auto;自动居中 <!DOCT…

学习Python先从了解Python开始

Python是一种高级编程语言&#xff0c;它的语法简洁易读&#xff0c;功能强大&#xff0c;应用领域广泛。Python不仅适用于数据科学、机器学习、Web开发等领域&#xff0c;还可以用于自动化脚本编写、游戏开发等。在本文中&#xff0c;我们将探讨Python的特点、应用领域以及未来…

[leetcode] 54. 螺旋矩阵

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;…

js调用html页面需要隐藏某个按钮

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

7-26 单词长度

题目链接&#xff1a;7-26 单词长度 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h> #include <stdbool.h>void printLen(int len, bool printOnce) {if (len) {if (printOnce) {printf(" %d",…

微信小程序picker设置了系统年度,打开选择年份从1年开始显示

背景&#xff1a;开发微信小程序时&#xff0c;使用了picker组件&#xff0c;设置值为当前系统时间年份&#xff0c;可以正常回显年份。但是打开面板选择年份的时候&#xff0c;默认从一年开始显示的。如下图所示。 原因&#xff1a;因为绑定的年份字段为Number类型。 解决方案…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…

【AI学习中常见专业英文缩写词的解释】

前言&#xff1a; 为了看着不无聊&#xff0c;文中插入了一些AI生成的狗图片 AI(Artificail Intelligence)人工智能&#xff1a; 让机器模拟和展示人类智能的技术。 GAI(Generative Artificail Intelligence)生成式人工智能: 利用复杂的算法、模型和规则&#xff0c;从大规…

fastjson

一&#xff1a;fastjson作用 1.将Java对象转换为json字符串》响应给前端。 2.将json字符串转换为Java对象 》接受前端的json数据封装到对象中。 二&#xff1a;常用API fastjson API 入口类是 com.alibaba.fastjson.JSON ,常用的序列化操作都可以在JSON类上的静态方法直接完…

DDD领域设计基础

1概述 作为架构师&#xff0c;我们在业务建模的时候不能完全凭经验、感觉&#xff0c;还得有一套方法论&#xff0c;DDD领域驱动设计恰巧可以作为业务建模的方法论来使用。 2 为什么要使用DDD 2.1 为什么需要DDD 复杂系统设计&#xff1a;系统多&#xff0c;业务逻辑复杂&a…

四信遥测终端入选河南省水利先进实用技术推广目录

近期&#xff0c;河南省水利科技推广中心发布通知&#xff0c;四信自主研发的“遥测终端机RTU”&#xff0c;列入河南省水利先进实用技术推广目录&#xff0c;认定为水利先进实用技术。 四信遥测终端 F9164系列 ●一体化设计 ●工业级设计 ●接口丰富、标准易用 ●大容量储存空…

python爬虫 - 爬取微博热搜数据

文章目录 python爬虫 -爬取微博热搜数据1. 第一步&#xff1a;安装requests库和BeautifulSoup库2. 第二步&#xff1a;获取爬虫所需的header和cookie3. 第三步&#xff1a;获取网页4. 第四步&#xff1a;解析网页5. 第五步&#xff1a;分析得到的信息&#xff0c;简化地址6. 第…

代码随想录阅读笔记-回溯【全排列 II】

题目 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2]输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3]输出&#xff1a;[[1,2,3],[1,…

JVM 性能调优命令(jps,jinfo,jstat,jstack,jmap)

常用命令&#xff1a;jps、jinfo、jstat、jstack、jmap jps jps查看java进程及相关信息 jps -l 输出jar包路径&#xff0c;类全名 jps -m 输出main参数 jps -v 输出JVM参数jps命令示例 显示本机的Java虚拟机进程&#xff1a; # jps 15729 jar 92153 Jps 90267 Jstat显示主类…

c 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用&#xff1b; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解&#xff1a; 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

外包干了7个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Spark01

Spark01 一. Spark概述二. Spark环境部署 - Local三. Spark环境部署 - Standalone1. Standalone集群概述2. Standalone环境部署3. 测试环境 四. Spark环境部署 - Standalone-HA1. 安装部署Zookeeper1. 下载2. zookeeper安装3. 配置StandAlone-HA集群 五. Spark On YARN -- 重点…

CSS 实现视差滚动效果

一、是什么 视差滚动&#xff08;Parallax Scrolling&#xff09;是指多层背景以不同的速度移动&#xff0c;形成立体的运动效果&#xff0c;带来非常出色的视觉体验 我们可以把网页解刨成&#xff1a;背景层、内容层、悬浮层 当滚动鼠标滑轮的时候&#xff0c;各个图层以不…