链表OJ题第二弹:环形链表和环形链表 II

前言

第一弹的链表题目比较基础,下面两道题目难度升级,可以先自己挑战一下,再来看解析。解析有图示和的文字,有助于你的理解。


1. 环形链表

(1)题目及示例

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

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

示例1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环

(2)解法

在环形链表中,从头结点开始出发,会进入到一个循环,不会停下来。我们可以用快慢指针来解决这个问题,慢指针走一步,快指针走两步。

如下图所示,因为它们两个指针没走一次,之间的距离就减小一步,并且它们之间的距离是整数一是任何整数的因子,所以fast指针一定能追上slow指针。

如何写成代码呢?我们可以写一个while循环,每次slow指针走一步,fast指针走两步,但是判断条件是什么?应该是该链表不是环形链表的情况。

  • 当有偶数个结点时,fast指针会直接到空指针,
  • 如果是奇数个结点的话,fast指针会走到空指针的前一个结点,再走的话就没跨过空指针。

所以判断的条件就是fast或者fast的next指针不为空。

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

(3)深入思考

我们上面已经证明了快指针走两步是一定可以追上的,那快指针一次走3步,走4步,一直到n步行吗?下面我将分析fast指针一次走3步的情况:

当N是奇数时,我们假设环形链表有C个结点。

所以会有一次追上了,两次追上了,还有永远追不上的情况。如果是fast指针一次走四步,也可以这么分析,只不过情况变复杂了。

结论:fast指针一次走大于两步,不一定追得上slow指针。

2.环形链表II

(1)题目及示例

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

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

示例1:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例2:

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例3:

输入:head = [1], pos = -1
输出:返回null
解释:链表中没有环

(2)思路详解

在阐述解题思路之前,我们先想一下:

  1. 当slow指针进入环形链表的时候,fast指针在环中能走几圈?
  2. 当slow指针进入环形链表的时候,fast指针需要走几圈,它们才能相遇?

第一个问题,从头结点到环形链表的第一个结点的长度,和环形链表的长度是随机的,所以可能出现slow指针还没进入环形链表时,fast指针在环形链表中已走了一圈以上的情况。

第二个问题,当slow指针进入环形链表中,不管fast指针走了几圈,基本都在slow指针的前面。我们想一想,slow指针走完一圈,fast指针至少走两圈以上,并且fast指针还在slow指针的前面,所以slow指针在走第一圈的时候,一定被追上。

如上图所示,我们知道了slow指针和fast指针走过的距离,并且我们知道slow指针一次走一步,fast指针一次走两步,就有了这样的等式关系:

2(L+X) = L+X+nC (n >=1)

化简后得到:L = nC - X (n = 1,2,3,4……)

我们假设n = 1,于是就有了L = C - X。也就是说,两个指针分别从头结点和相遇结点开始,一次走一步,当他们两个指向的地址相同时,这就是环形链表的第一个结点。那n不是1呢?结论也成立,只不过从相遇结点开始的指针需要再环中走上一圈以上。代码如下:

struct ListNode *detectCycle(struct ListNode *head) 
{struct ListNode* slow = head, *fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){//相遇struct ListNode* meet = slow;//利用公式while(meet != head){meet = meet->next;head = head->next;}return meet;}}return NULL;
}


总结

这两道题做下来,会开拓自身的思路,可以自己推导一下上面的证明,巩固所学。话不多说,练起来!

创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!

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

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

相关文章

Stable Diffusion 3 发布及其重大改进

1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后,Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说,我们快来看看吧! 2. 什么是Stable Diffusion…

dolphinscheduler集群部署教程

文章目录 前言一、架构规划二、配置集群免密登录1. 配置root用户集群免密登录1.1 hadoop101节点操作1.2 hadoop102节点操作1.3 hadoop103节点操作 2. 创建用户2.1 hadoop101节点操作2.2 hadoop102节点操作2.3 hadoop103节点操作 三、安装准备1. 安装条件2. 安装jdk3. 安装MySQL…

一个支持将Html页面转为PDF的.Net开源项目

推荐一个可以将Html页面转为PDF的开源项目。 01 项目简介 这是一个基于.Net开发的开源项目,本质是用 Webkit 引擎将 HTML 页面转换为 PDF,可以用在控制台、 Web 应用程序和 Web API中。 02 使用示例 1、创建转化器 //同步转化器 var converter new…

React18源码: Fiber树的初次创建过程图文详解

fiber树构造(初次创建) fiber树构造的2种情况: 1.初次创建 在React应用首次启动时,界面还没有渲染此时并不会进入对比过程,相当于直接构造一棵全新的树 2.对比更新 React应用启动后,界面已经渲染如果再次发…

python 3.11中安装sympy(符号工具包)

1.python环境: 2.安装遇到问题: … 3.升级pip cmd命令行中,执行如下命令: python.exe -m pip installl --upgrade pip 4.再次安装sympy cmd命令行中,执行如下命令: pip install sympy 5.简单应用 对…

Stable-diffusion安装时Can‘t load tokenizer for ‘openai/clip-vit-large-patch14‘问题解决

Can’t load tokenizer for openai/clip-vit-large-patch14’问题解决. 如果你在安装stable-diffusion的时候遇到了这个问题,可以下载本博客的绑定资源,然后修改项目中的文件地址就可以了。 例如报错: 这是因为hugginface现在被墙了&#…

力扣LCR 140. 训练计划 II(顺序遍历,快慢指针)

Problem: LCR 140. 训练计划 II 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:顺序遍历 欲返回倒数第cnt个节点则需要顺序遍历到len-cnt(其中len为链表的长度) 思路2:快慢指针 让一个快指针fast指向cnt 1个节点&#x…

在 where子句中使用子查询(二)

目录 ANY ANY :功能上与 IN 是没有任何区别的 >ANY :比子查询返回的最小值要大 ALL >AL :比子查询返回的最大值要大 EXISTS() 判断 NOT EXISTS Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209…

zookeeper快速上手

文章目录 1. docker安装zookeeper2. zookeeper基本使用(Linux)新增结点查看命令修改命令删除命令其他命令 3. zookeeper ACL(Linux)ACL 命令行ACL 构成ACL 特性world授权模式ip授权模式auth模式digest授权模式 4. IDEA操作Zookeeper连接zookeeper创建结点…

推荐Miaoo朋友圈程序全开源版源码

Miaoo朋友圈的全开源程序源码提供了一套完整的解决方案,允许用户在前台轻松发布图文、视频和音乐内容。同时,用户可以设置地理位置信息,或者选择自定义位置。此外,系统支持将发布的内容设置为广告模式,并通过站内消息或…

来看大厂如何设计运营后台系统的?

0 背景 重运营的应用。对于App里的顶导航、我的页面、弹窗等,需要根据模式、版本、平台、语言、渠道等不同的维度进行运营管理。随着业务快速发展,版本快速迭代,如何: 保持运营资源能够被高效、稳定和灵活地配置高效稳定的为新的…

pytorch数学运算

目录 1. pytorch的数学运算包括2. 基本运算3. matmul4. power sqrt rsqrt5. exp log6. 近似值7. clamp 1. pytorch的数学运算包括 ▪Add/minus/multiply/divide ▪Matmul ▪Pow ▪Sqrt/rsqrt ▪Round 2. 基本运算 、-、*、/ 也可以使用函数add sub mul div 3. matmul 矩阵…