【数据结构】链表OJ:力扣141.环形链表、142.环形链表II

news2024/10/7 6:51:26

今天要分享的关于链表的题目是环形链表

目录

题目141. 环形链表 - 力扣(LeetCode)

题解

关于快慢指针的深入研究

题目2:142. 环形链表 II - 力扣(LeetCode)

题解


以下是题目链接

141. 环形链表 - 力扣(LeetCode)

题目141. 环形链表 - 力扣(LeetCode)

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

题目给出了三种示例

 

 

 给出了这么多示例无非就是想告诉我们结点在环中是无法确定的。

首先我们可以确定正常的链表可以遍历结束,但是带环链表不能用循环来解决问题,因为链表是环形的,闭环会形成死循环;

题解

我们不妨定义一个快指针和慢指针来解决问题,顾名思义,快指针就是向后迭代比较快的指针,而慢指针就是迭代较慢的指针,我们也可以理解为追及问题;

所以让slow(慢指针)一次走一步,fast(快指针)一次走两步

 我们可以看到当两个指针进入到环中时就一直会在循环当中直到相遇,就像追及问题一样很好理解;

同样的反过来看如果快慢指针相遇了,那就说明这个链表带环;

以下是本题代码

bool hasCycle(struct ListNode *head) {
       struct ListNode *slow=head;
    struct ListNode *fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
    
}

要理解起来也不算困难

1.首先定义两个结构体类型的快慢指针;

2.因为快指针走的比较快,他也起着“探路”的作用,所以可以利用快指针和快指针指向的下一个结点是否为空作为判断条件,不为空就让slow走一步,fast走两步;

3.最后再加以判断,如果快慢指针指向的位置相同,就说明有环,返回ture,否则则无环,返回false;

以上就是题目的题。

接下来我们要讨论关于这道题的逻辑问题

关于快慢指针的深入研究

我们在理解题目的时候一定会出现这样的问题

1.在带环链表中slow和fast指针一定会相遇吗?

2.一定slow走一步和fast走两步吗?其他步数(2以上的)是否也会相遇?

先说结论,上面我们就证明过了,当slow走一步fast走两步时,是一定会相遇的。

我们继续画图说明

 因为fast会先进环,且fast追slow,所以假设slow进环时slow和fast之间的距离是N;

当slow向前走一步时,fast向前走两步,这时再次计算两个指针之间的距离就变成了N-1,这里应该不难理解;

也就是说当两个指针进环之后,fast开始追及slow,slow每走一步fast就走两步,两者之间距离就缩小1,就这样以此类推N,N-1,N-2,......3,2,1,0。当距离为0的时候就说明fast已经追上了slow 

接下来当我们将fast快指针的步数固定为三步的时候快慢指针是否还会相遇呢? 

先说结论,不一定相遇。

和上面一样两个指针进环时开始追及;

和上面不同的是fast走三步的时候,两个指针之间的距离就减少2,所以两者之间的距离为N,N-2,N-4,.....以此类推。当两者之间开始的距离是偶数的时候会相遇,但是当两者的距离是奇数的时候会出现负数,出现负数就意味着错过,再新一轮追及时就会越来越远;

接下来继续深入研究环形链表的题目

题目2:142. 环形链表 II - 力扣(LeetCode)

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

题解

既然都是环形链表的问题,我们不妨继续使用双指针来解决问题。以下为本题代码

我们可以让一个指针从相遇点开始走,另一个指针从链表头开始走,那么他们就会在入口点相遇那么以下就是对这个结论的推理

这道题的意思就是求环的入口点,我们继续画图理解

我们上面规定fast的速度是slow的两倍,如图:

 我们可以再新定义一个结点meet,用来表示两个两个指针相遇的地方

x用来表示环的入口点和相遇点的距离;

L表示链表头到环入口的距离;

C来表示环的周长;

所以我们可以得出slow走的路程是L+x;

因为fast和slow之间的距离每走一步就缩小1,所以可以知道fast在一圈之内一定可以和slow相遇;

fast所走的路程是:L+C+x;

又因为fast的速度是slow的两倍,所以fast所走的路程也可以是2(L+x);

这样就有如下关系

2(L+x)=L+C+x

也可以是L+x=n*x,这里n就是圈数,

所以L=n*C-x=(n-1)*C+C-x;

以上就是对推论的原理

以上就是两道关于链表的题目,希望在链表的学习中对你有所帮助

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

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

相关文章

塑料回收---未来化工行业的新兴增长领域

大量的旧塑料被浪费 从南极洲到北极,在原始海岸线上冲刷的塑料废物,以及太平洋上巨大的塑料废物浮岛,得到了媒体的广泛报道,并促成了消费者消费意识发生转变。 研究表明,大多数废旧塑料被送往垃圾填埋场和焚烧&#…

Go语言设计模式之责任链模式

其实很多人不知道,责任链模式是我们工作中经常遇到的模式,特别是web后端工程师,我们工作中每时每刻都在用:因为市面上大部分的web框架的过滤器基本都是基于这个设计模式为基本模式搭建的。 1.模式介绍 我们先来看一下责任链模式(Chain Of Responsibility Design Pattern…

react实现点击获取json对象的jsonPath

准备 安装 react-json-view:npm install --save react-json-view 可参考的一些开源库:react-json-path-picker,json-path-picker 线上工具:jsonpath tool JsonPath JsonPath官方文档 用来解析多层嵌套的json数据。JsonPath 是一…

8分钟的面试,我直呼太变态了......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

08 FPGA—计数器与分频器的应用

1. 理论 时序逻辑电路中最基本的单元—寄存器,我们可以使用寄存器来做计数器。基本上关于时间的设计都离不开计数器。 计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。计数器一般都是从 0 开…

JSON-框架的具体使用

JSON-框架的具体使用 非 SpringBoot 项目 Jackson Jackson 是另一个流行的JSON序列化和反序列化库,具有以下特点 速度快:Jackson 采用了高效的JSON解析算法和字节码生成技术,使得其序列化和反序列化速度非常快。支持全类型序列化&#xff1…

V8 过去版本的性能提升汇总

(预测未来最好的方法就是把它创造出来——尼葛洛庞帝) V8 官方链接 NodeJs8.3之前的代码优化建议 NodeJs8.3版本之后的turbofan虚拟机引擎 编写性能更高的JavaScript代码 chromium 优化博客 chrom v8版本发布路线图 V8 是 Google 的开源高性能 JavaScri…

unity 实现水的波纹效果

之前的实现过这个效果,可惜没有记笔记,所以现在有点遗忘,连多个波纹一起在水面上实现的效果都忘记了,所以,查看了下之前实现的代码,现在再记一下笔记。 基础的波纹效果 要实现波纹,首先要知道…

技术转管理,先来试试管理好项目

今天分享的主题是:如果你想技术转管理,先来试试管好一个项目 技术转管理,是很多技术人员的梦想,这也是30多岁之前还在做技术的人,也会对自己常常发出居安思危的意识表现,所以经常有人问我,怎么样…

chatGPT润色中英论文软件-文章修改润色器

chatGPT可以润色英文论文吗? ChatGPT可以润色英文论文,它具备自动纠错、自动完善语法和严格全面的语法、句法和内容结构检查等功能,可以对英文论文进行高质量的润色和优化。此外,ChatGPT还支持学术翻译润色、查重及语言改写等服务…

Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II

目录 1. 定义一个类Generator 🌟🌟 2. 螺旋矩阵 II 🌟🌟 3. 删除排序链表中的重复元素 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日…

Linux 设备树

1 什么是设备树? 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如 CPU 数量…

【Proteus仿真】| 05——问题记录

系列文章目录 【Proteus仿真】| 01——软件安装 【Proteus仿真】| 02——基础使用 【Proteus仿真】| 03——超详细使用教程 【Proteus仿真】| 04——绘制原理图模板 【Proteus仿真】| 05——问题记录 文章目录 前言1、51单片机仿真2、stm32仿真1. stm32 adc 采集电压一直为0 3、…

显卡3080设备CentOS 7.9 环境安装最新anconda、tensorflow-gpu 、cudatoolkit、cudnn、 python

目标:使用3080显卡搭建环境 系统安装 显卡驱动安装: 安装anconda 安装 python 安装 :cuda 安装:cudnn 安装 :tensorflow 一:系统安装:详见历史文档 二:显卡驱动安装:详见历史 三:整…

安装2023最新版_华为欧拉操作系统_OpenEuler操作系统_并配置IP地址_联网---linux工作笔记055

强调,一定要记得,硬盘多给点,50G根本不够用,搭建集群的话,自己测试都要100G才行哈.. 要不然麻烦,因为别的可以动态修改,但是硬盘大小修改了,不起作用,需要在 linux中再设置分区很麻烦 https://www.openeuler.org/zh/download/ 首先去下载安装包 然后找到这个安装包下载 然…

虚拟机中linux操作系统如何连网

文章目录 方法镜像来源本文前提创建centos7虚拟机1. 创建新的虚拟机,选择典型配置2. 安装来源选择上述下载的centos3. 命名虚拟机时注意事项如下图所示4. 后面配置硬盘大小默认20GB足以,然后调整虚拟机设置,可参考下图5.运行虚拟机 实操建议 …

混频器IP3的测量以及测试误差的来源分析

混频器线性度一直是射频系统设计面临的一个关键问题。混频器的非线性会产生不需要的、不可滤的杂散、互调和非线性失真。例如,非线性混频可能导致不希望的杂散,例如2fRF✕2fLO 或2fRF✕fLO 频率分量,加剧射频系统频谱再生问题。 1、IP3和IMD…

工具接口调用报错:“error“: “Unsupported Media Type“

工具接口调用报错:"error": "Unsupported Media Type" 问题原因: Media Type,即是Internet Media Type,互联网媒体类型,也叫做MIME类型,在Http协议消息头中,使用Content-T…

安全成就未来|Fortinet Accelerate 2023·中国区巡展首站启幕

Fortinet Accelerate 2023中国区巡展 年度网络安全盛会 Fortinet Accelerate 2023中国区巡展,昨日在深圳拉开帷幕,开启15城巡展的“首城之站”。本年度巡展主题“安全成就未来”,Fortinet与中企通信、亚马逊云科技等生态合作伙伴&#xff0c…

【动态代理】JDK动态代理与cglib动态代理源码解析

JDK动态代理 demo展示 UserService,接口类 public interface UserService {void addUser(); }UserServiceImpl,实现类 public class UserServiceImpl implements UserService {Overridepublic void addUser() {System.out.println("register al…