有关于链表带环的两道OJ题目

news2024/9/20 11:32:17

目录

1.判断链表是否带环

1.1快指针的速度为慢指针的2倍

1.2快指针的速度为慢指针的3倍

2.找出带环链表开始入环的第一个节点 

2.1将快慢指针相遇的节点与后面分开,构造交叉链表

2.2记录快慢指针相遇节点,与头结点一起向后走,相遇点为入环点


1.判断链表是否带环

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

这道题目较为简单,我们知道,带环链表区别于不带环链表的一大特点就是它的最后一个节点指向链表中的某个节点,而不是NULL。

从这一点出发,我们可以探索出这道题的核心解法,定义一对快慢指针(slow和fast)在链表里面往下走,抓住带环链表往下走走不到头的特点,我们思考,大概率在慢指针入环后快指针会重新追上慢指针

好,那我们接下来就可以探讨一下这种方案的可行性啦~

1.1快指针的速度为慢指针的2倍

也就是慢指针走一步,快指针走两步这种情况。

依照我们正常的认知,这种情况非常可行~

那事实真是如此吗?哈哈,还真是如此!

如图所示,设slow进环时,fast与slow相距N个节点

进行下一步:

slow走一步,fast走两步,相距N-1个节点

slow走一步,fast走两步,相距N-2个节点

slow走一步,fast走两步,相距N-3个节点

.............

slow走一步,fast走两步,相距1个节点

slow走一步,fast走两步,相遇。

通过上述分析,快指针的速度为慢指针的2倍是完全可行的~

1.2快指针的速度为慢指针的3倍

也就是说慢指针走一步,快指针走三步。

经过第一种情况的讨论,你是否觉得这种情况不成立呢?

别着急,我们先来分析一波~

如图所示,设slow进环时,fast与slow相距N个节点

此时要分为两种情况讨论

1.当N为偶数时,进行下一步:

slow走一步,fast走三步,相距N-2个节点

slow走一步,fast走三步,相距N-4个节点

slow走一步,fast走三步,相距N-6个节点

...........

slow走一步,fast走三步,相距2个节点

slow走一步,fast走三步,相遇

2.当N为奇数时,进行下一步:

slow走一步,fast走三步,相距N-2个节点

slow走一步,fast走三步,相距N-4个节点

slow走一步,fast走三步,相距N-6个节点

...........

slow走一步,fast走三步,相距1个节点

slow走一步,fast走三步,相距-1个节点

看到相距-1个节点,此时出现的状况就是fast跳过了slow ,并没有遇上,所以后续是否能遇上还需要接着讨论。

那接下来我们就设环的总长度为C,此时两个指针相距C-1

此时还要分为两种情况讨论

1.当C为奇数,即C-1为偶数时,进行下一步: 

slow走一步,fast走三步,相距C-3个节点

slow走一步,fast走三步,相距C-5个节点

slow走一步,fast走三步,相距C-7个节点

...........

 slow走一步,fast走三步,相距2个节点

 slow走一步,fast走三步,相遇

2.当C为偶数,即C-1为奇数时,进行下一步:

slow走一步,fast走三步,相距C-3个节点

slow走一步,fast走三步,相距C-5个节点

slow走一步,fast走三步,相距C-7个节点

...........

slow走一步,fast走三步,相距1个节点

slow走一步,fast走三步,相距-1个节点

好,看到此时再次出现-1个节点,大部分人就可以笃定, “快指针的速度为慢指针的3倍”这种解法在N为奇数且C为偶数时,存在无法相遇的情况。

BUT!

请看以下分析!

在slow进环时,设前面没有环的部分长度为L,fast与slow相距N,环的长度为C,fast在环里面转了x圈。

根据fast走的长度是slow的三倍这个关系,列出以下等式 

3L=L+x*C+(C-N)

化简:2L=C*(x-1)-N

这里复习一下数学:奇数*奇数=奇数;奇数*偶数=偶数;偶数*偶数=偶数

可见,2L一定是个偶数,当C为偶数,N为奇数时,得到的结果一定为奇数,与2L为偶数相违背!

故:“在N为奇数且C为偶数时” 这种情况不存在!

即:快指针的速度为慢指针的3倍,可行!

之后往下的速度为4、5...倍关系就不一一展开讨论啦~ 

使用2倍方法的代码如下:

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

2.找出带环链表开始入环的第一个节点 

142. 环形链表 II - 力扣(LeetCode)

 这道题目是在上道题目基础上的延伸,想要找出环形链表入环的第一个节点可不能再用单纯只使用快慢指针了,因为快慢指针相遇点并不是环形链表入环的第一个节点。

那么该怎么写呢?

利用 “快指针的速度为慢指针的2倍” 这里提供两种思路:

2.1将快慢指针相遇的节点与后面分开,构造交叉链表

 这里首先说明一点:在slow入环之后,fast走的圈数不会超过两圈就能与slow相遇。所以相遇节点一定不是入环点!

这样的话,利用 “将快慢指针相遇的节点与后面分开,构造交叉链表” 这一思路,通过找到交叉链表的交叉点,就能找到入环点。

缺点就是需要的指针稍微有点多

2.2记录快慢指针相遇节点,与头结点一起向后走,相遇点为入环点

这种方法正常来说想不到,因为这是根据简单的数学推理得出

推理过程如下: 

(这部分与前面一样)在slow进环时,设前面没有环的部分长度为L,fast与slow相距N,环的长度为C,fast在环里面转了x圈。 

根据fast走的长度是slow的两倍这个关系,列出以下等式 

2L=L+x*C+(C-N)

化简:L=x*C+(C-N)

其中C-N代表相遇节点距离入环点剩下的节点。 

通过等式我们可以推理出:

当x=0时,L=C-N,刚好相遇节点与头结点距离入环点的长度相同。

当x!=0时,相遇节点与头结点距离入环点相差x个圈数,说明L相对较长,那么等头指针走完多余的x*C长度后,剩下的距离就是C-N了。

因此这种方法成立。

代码如下:

typedef struct ListNode ListNode;

struct ListNode *detectCycle(struct ListNode *head) {
    ListNode*fast,*slow;
    fast=slow=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            ListNode*prev=head;
            while(prev!=slow)
            {
                prev=prev->next;
                slow=slow->next;
            }
            return prev;
        }
    }
    return NULL;
}

---------------------------------------------------------------------------------------------------------------------------------

OK~  本次OJ题目分享就到这里

希望收获小伙伴们的支持!!!!

有问题欢迎在评论区评论哦~ 

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

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

相关文章

笔记:现代卷积神经网络之VGG

本文为李沐老师《动手学深度学习》笔记小结,用于个人复习并记录学习历程,适用于初学者 神经网络架构设计的模块化 然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&a…

C语言-栈和队列

文章目录 🎯引言👓栈和队列1.栈1.1栈的概念与结构1.2栈的实现 2.队列2.1队列的概念与结构2.2队列的实现 🥇结语 🎯引言 欢迎来到HanLop博客的C语言数据结构初阶系列。在之前的文章中,我们详细介绍了链表及其操作方法。…

LabVIEW多线圈电磁式振动发电机测试

开发了一种基于LabVIEW设计的多线圈电磁式振动发电机测试系统。系统通过高效的数据采集、波峰检测及相位差计算,优化了传统振动发电机的测试流程,提升了电压波形分析的精度和效率,具有较好的应用前景和推广价值。 项目背景 随着可再生能源技…

【python】Numpy运行报错详细分析:IndexError: too many indices for array

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBase 正在 章节内容 上一节我们完成了: HBase …

docker tomcat 404

HTTP 404状态码表示“Not Found”,即服务器无法找到请求的页面。 当用户尝试访问一个不存在的网页时,服务器会返回这个状态码。这个状态码是HTTP协议的一部分,用于告知客户端(通常是浏览器)服务器无法完成请求。404状…

springboot校园跑腿服务系统-计算机毕业设计源码15157

摘要 本文介绍了一种基于Springboot和uniapp的校园跑腿服务系统的设计与实现。该系统旨在为大学校园提供一种方便快捷的跑腿服务,满足学生和教职员工的日常需求。首先,系统采用了Springboot作为后端框架,利用其轻量级、高效的特性&#xff0c…

抖音短视频seo矩阵系统源码开发技术分享(二)--SaaS开源

目录 市场背景分析 一、抖音短视频seo矩阵系统开发部署流程 二、 源码开发功能构思 三、 抖音短视频seo源码开发部署注意事项 四、 部分开发代码展示 市场背景分析 抖音短视频seo矩阵系统是通过不同平台不同账号之间建立联系,通过将同一品牌下不同平台不同账号…

操作系统(3)——内存管理

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU)内存管理无存储器抽象存储器抽象实现以下几方面小结 虚拟内存实现以下方面总结 页面置换算法概述常见的页面置换算法先进先出(FIFO)算法最近最少使用(LRU)算法总结 小程…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中,代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能,帮助开发者更好地组织和管理代码。通过合理配置,我们可以清晰地看到各个package之间的…

Stable Diffusion 使用详解(1)---- 提示词及相关参数

目录 背景 提示词 内容提示词 人物及主体特征 场景 环境光照 画幅视角 注意事项及示例 标准化提示词 画质等级 风格与真实性 具体要求 背景处理 光线与色彩 负向提示词 小结 常用工具 另外几个相关参数 迭代步数 宽度与高度 提示词引导系数 图片数量 背景…

MongoDB教程(十三):MongoDB覆盖索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言什么是覆盖…

开放式牙耳机选哪种?2024五大新晋爆卖机型精选!

开放式蓝牙耳机不会因为耳机与耳朵的贴合度不够而影响音质。此外,开放式蓝牙耳机的外形设计更加时尚,更加符合现代人的审美需求。开放式蓝牙耳机的出现不仅解决了传统入耳式蓝牙耳机佩戴不适的问题,还具有更加舒适、健康、自然、时尚等多重优…

小白可用超稳定内网穿透工具——natapp全方位使用教程(合法合规)

本篇博客仅供学习参考使用!!! 2021年11月14日,国家网信办发布《网络数据安全管理条例(征求意见稿)》,《条例》第41条第2款规定,任何个人和组织不得提供用于穿透、绕过数据跨境安全网关的程序、工具、线路等…

实验07 接口测试postman

目录 知识点 1 接口测试概念 1.1为什么要做接口测试 1.2接口测试的优点 1.3接口测试概念 1.4接口测试原理和目的 2 接口测试内容 2.1测什么 2.1.1单一接口 2.1.2组合接口 2.1.3结构检查 2.1.4调用方式 2.1.5参数格式校验 2.1.6返回结果 2.2四大块 2.2.1功能逻辑…

降低物联网开发门槛的TuyaOS操作系统重磅更新:AI赋能设备升级,配网速度10倍提升,改变传统开发方式

作为降低智能解决方案开发门槛的 TuyaOS 操作系统,此次又迎来了重大更新(点击查看 TuyaOS 完整介绍)! 本次 TuyaOS 3.10.0 版本发布了超丰富的开发框架,覆盖多种协议连接和平台,可供开发者更快速便捷地接入…

直播领夹式麦克风哪个品牌好?直播麦克风十大排行榜推荐

​在这个充满活力与创意的时代,无线领夹麦克风成为了我们捕捉声音的得力助手。无论是在熙熙攘攘的美食街探店,还是在安静的书房进行录制,还是在嘈杂的户外采访,无线领夹麦克风都能出色地完成任务。很多朋友都曾为麦克风的选择而烦…

数据字典的解释

一、没有数据字典的时候,一般通过备注来标明,数据项不同数值所代表的不同含义。 如下图所示,但这样不够灵活。 二、引入数据字典的形式 数据字典由两张表组成,分别是字典类型表和字典数据表。 字典类型表中的字段都是存在多个值…

【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

部分功能的实现和算法

目录 1.雪花算法 2.MD5加密 3.小眼睛显示密码 4.发送验证码 5.倒计时 1.雪花算法 SnowFlake 中文意思为雪花,故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本 雪花算法的原理就是生成一个的 64 位比特…