链表带环问题——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.mzph.cn/web/712.shtml

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

相关文章

企微知识库是如何搭建的?这篇文章来解答

知识库在企业中发挥着至关重要的作用,它不仅能够存储和整理重要的工作资料,还能提高员工的工作效率,加强团队之间的协作。对于使用微信企业版(企业微信)的企业来说,搭建一个专门的知识库是极有必要的。本文…

ceph osd分组

一、前言 使用分组可以更好的管理osd,将不同类型的磁盘,分到不同的组中,例如hhd类型的osd分配到hhd组,ssd类型的osd分配到ssd组,将io要求不高的分配到hhd组做存储,io要求高的分配到ssd组做存储 二、配置 查…

ubuntu23.10.1 php8.2安装

1、更新镜像源 apt update2、安装php apt install php php-fpm php-mysql其他扩展包,在后面加个-可以查看,选择安装,我这里是php8.2版本 apt-get install php8.2- 2.1php与nginx结合 PHP-FPM的配置文件位于/etc/php/{PHP版本}/fpm/pool.d/www.conf;…

字体反爬知识积累2

一、os模块中函数的应用 如何获取当前文件中所有文件的路径方法 这段代码使用 os.walk()函数来遍历指定目录 imgs 下的所有子目录和文件。具体来说,os.walk()函数返回一个生成器,可以在每次迭代中获取目录树中的一个元组,元组包含当前目录的…

【Linux C | 多线程编程】线程同步 | 条件变量(万字详解)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-04-15 0…

电大搜题微信公众号:重庆开放大学学子的学习利器

在当今信息化时代,学习已经成为每个人不可或缺的一部分。然而,对于重庆开放大学的学子们来说,由于远程教育的特殊性,他们面临着更大的学习挑战。幸运的是,他们现在可以依靠一款强大的学习利器——电大搜题微信公众号&a…

单片机基础知识 07

一. 键盘检测 键盘分为编码键盘和非编码键盘。 编码键盘 :键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或者键值,如计算机键盘。 非编码键盘:靠软件编程来识别。 在单片机组成的各种系统中,用的较多的…

Darknet框架优化介绍

一、DarkNet框架简介 1.DarkNet的简介 Darknet是一个完全使用C语言编写的人工智能框架,可以使用CUDA的开源框架。主要应用于图像识别领域。 它具有可移植性好,安装间接,查看源码方便等优势,提供了OpenCV等附加选项,还…

(七)Pandas时序数据 学习简要笔记 #Python #CDA学习打卡

一. 时序数据简介 1)定义 时间序列(time series),就是由时间构成的序列,它指的是在一定时间内按照时间顺序测量的某个变量的取值序列,比如一天内的温度会随时间而发生变化,或者股票的价格会随…

c语言题目之求最大公约数

题目内容:求最大公约数 给定两个数,求这两个数的最大公约数 例如: 输入:20 40 输出:20 什么叫最大公约数? 方法分析: 提示:这里我们用辗转相除法: 例如:输…

腾讯云APP备案指南:一站式完成备案手续,助您顺利上线

工信部最新通知要求所有互联网信息服务提供者完成移动互联网应用程序备案手续。腾讯云为开发者提供了简单易行的备案流程,本文详细解答如何在腾讯云平台完成备案,帮助开发者快速上线自己的APP。从验证备案域名到腾讯云审核,一步步指导您完成备…

vue 一键更换主题颜色

这里提供简单的实现步骤,具体看自己怎么加到项目中 我展示的是vue2 vue3同理 在 App.vue 添加 入口处直接修改 #app { // 定义的全局修改颜色变量--themeColor:#008cff; } // 组件某些背景颜色需要跟着一起改变,其他也是同理 /deep/ .ant-btn-primar…

响应式修改 页面字体字号【大 中 小 】

浅浅记录下&#xff0c;工作中遇到的问题&#xff0c;修改页面文本字号。 <p class"change_fontSize">[ 字号 <a href"javascript:doZoom(18)">大</a><a href"javascript:doZoom(16)">中</a><a href"ja…

『FPGA通信接口』汇总目录

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

墨子web3时事周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团&#xff0c;凭借其在前沿科技领域的深耕不辍&#xff0c;已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻&#xff0c;集团于今年四月末震撼推出了颠覆性的Web3全套解决方案&#xff0c…

在 Ubuntu 12.10 安装 wxPython

安装 wxPython 可以使用 pip 工具&#xff0c;但在 Ubuntu 12.10 上需要首先安装 wxPython 的依赖项。请注意&#xff0c;Ubuntu 12.10 已于2013年终止支持&#xff0c;建议升级到更高版本的 Ubuntu。以下是在 Ubuntu 12.10 上安装 wxPython 的一般步骤&#xff1a; 一、问题背…

考研日常记录

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 2024.4.18 周四 课程情况&#xff1a; 无课 时间规划&#xff1a; 上午&#xff1a;休息 下午&#xff1a; 事项耗时进度备注写作业1h复习英语单词…

深入浅出学习切片LOD——ArcGIS server模拟缓存切片(影像快显)

一、第一次实践 原理 免切片实现影像服务的模拟切片&#xff0c;主要原理是接收前端传过来的xyz(行列层级)以及切片方案&#xff0c;计算出该请求的切片的四至经纬度信息&#xff0c;通过mapserver的exportImage接口&#xff0c;传入每个模拟切片的四至经纬度信息得到图片返回…

Spark01

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

ESP32S3在VScode中使用USB口调试

ESP32S3在VScode中使用USB口调试 安装USB驱动修改工程的配置文件launch.jsonsettings.json 启动GDB Server 安装USB驱动 在powershell中输入下面指令&#xff1a; Invoke-WebRequest https://dl.espressif.com/dl/idf-env/idf-env.exe -OutFile .\idf-env.exe; .\idf-env.exe…