力扣——环形链表问题

判断链表是否有环以及入环的第一个节点

  • 前言
  • 判断链表是否有环
  • 找到入环的第一个节点

前言

    大家好,前段时间,熊二学习了关于环形链表相关的问题,以下是我的见解,希望能够帮助你们呀!

判断链表是否有环

给定一个链表,判断链表中是否有环。OJ链接
环形链表
方法:快慢指针
思路:

  如果没有环,快指针永远比慢指针快,,在这个追击问题中,慢指针永远追不上快指针,那么快慢指针永远都不会相遇,说明它们在一条直线上跑 ,故没有环。
在这里插入图片描述
  如果有环,假设快指针是慢指针速度的两倍,那么快指针一定比慢指针先进入环,等慢指针开始进入环,这个追及问题就开始了,在同一个环中,快指针和慢指针速度不一至,快指针一定会追上慢指针的,当快指针=慢指针时,表明一定有环。
在这里插入图片描述

代码如下:

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

拓展问题:
1.为什么会相遇,有没有可能错过,永远追不上,请证明。

假设slow进环时,fast跟slow的距离是N,fast追击slow的过程距离变化如下:
N-1
N-2

3
2
1
0
每追击一次,fast与slow的距离是-减1,最后一定会追上
在这里插入图片描述

2.slow一次走1步,fast走3步,4步,5步,n步,一定能追上吗?请证明。

假设slow进环时,fast跟slow的距离是N,fast追击slow的过程距离变化如下:
若N为偶数         若N为奇数
N-2                 N-2

N-4                 N-4
…                  …
4                    3
2                    1
0                    1
追上了             错过了,进入新一轮的追击
                   新一轮,距离变成了C-1
                   C-1为偶数,下一轮就追上了
                   C-1为奇数,下一轮会不会追上呢?
在这里插入图片描述
关于C-1为奇数,下一轮会不会追上呢?

我们暂且把问题变换成,如果同时存在N是奇数且C是偶数,fast会不会追上slow?

假设slow进环时,fast跟slow的距离是N
slow走的距离:L
fast走的距离:L+xC+C-N;
slow进环时,假设fast已经在环里面转了x圈
fast走的距离是slow的3倍
3
L =L+ xC +C-N;
化简:
2
L= (x+1)*C+C-N;
偶数 =(x+1)*偶数-奇数
如果同时存在N是奇数且C是偶数,
偶数 =(x+1)*偶数-奇数 ,不存在 ,所以,永远追不上不成立
总结:一定能够追上

找到入环的第一个节点

给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULL。OJ链接
在这里插入图片描述

运动过程:
在这里插入图片描述

首先,我们指定快指针fast,慢指针slow,快指针以慢指针两倍的速度走(两指针同时走)。

当快指针进环时,慢指针还在追赶(红色)
当慢指针进环时,快指针已经在环里面(蓝色),这时,不久后,快指针就会追上慢指针(在这个环中)
当快指针追上慢指针时(紫色),我们从中寻找等式。

设AB=L,BC=N,环的总长度为C,寻找关系
slow的路程:L+C-N
fast的路程:L+XC+C-N
fast是slow路程的两倍:2
(L+C-N)=L+X*C+C-N;
继而得出:L=(X-1)*C+N;
因为C是圆环的长度,所以fast不管是多走X-1圈,还是多走了1圈,都没有区别,最后得出:L=N这个关键条件

代码如下:

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.mzph.cn/web/56262.shtml

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

相关文章

如何在一个月内快速学习掌握大模型

原本给自己的是一个月时间,通过梳理之后我自信的认为不需要一个月,两周即可,相较于其他技术,大模型应用的门槛要低得多。 先明确你想要深入到哪一层 1、基础设施层:了解即可,关注NVIDIA和超大规模厂商的最…

[自动化测试:Selenium]:环境部署和Webdriver的使用

文章目录 修改安装源打开Python Packages。点击梅花按钮。在弹出的对话框中,填入Name(随便填),Repository URL,选择下列的源,一般先选择清华源按OK确认。配置完成 安装seleniumFile→Settings→Project&…

多签机制简明理解及实例说明

目录 Multisignature机制简明理解及实例说明 Multisignature机制中的公钥、私钥、Nonce及签名验签详解 加密货币托管账户的多重签名机制 Multisignature机制简明理解及实例说明 一、基本概念 Multisignature(多重签名)机制是一种先进的加密技术,它允许一笔交易必须由多…

word删除空白页 | 亲测有效

想要删掉word里面的末尾空白页,但是按了delete之后也没有用 找了很久找到了以下亲测有效的方法 1. 通过鼠标右键在要删除的空白页面处显示段落标记 2. 在字号输入01,按ENTER(回车键) 3.成功删除了!! PS…

【ArcGIS Pro实操第八期】绘制WRF三层嵌套区域

【ArcGIS Pro实操第八期】绘制WRF三层嵌套区域 数据准备ArcGIS Pro绘制WRF三层嵌套区域Map-绘制三层嵌套区域更改ArcMap地图的默认显示方向指定数据框范围 Map绘制研究区Layout-布局出图 参考 本博客基于ArcGIS Pro绘制WRF三层嵌套区域,具体实现图形参考下图&#x…

两性离子水凝胶助力微针传感器:稳定灵敏的监测神器

大家好!今天我要向大家介绍一项关于生物相容性核壳微针传感器的研究——《Biocompatible Core–Shell Microneedle Sensor Filled with Zwitterionic Polymer Hydrogel for Rapid Continuous Transdermal Monitoring》发表于《ACS Nano》,该传感器填充两…

力扣每日打卡挑战 3184. 构成整天的下标对数目 I

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…

深入解析 Golang 并发编程中的同步机制:WaitGroup 与 Mutex 详解

文章目录 一、简介二、WaitGroup 的使用1. 什么是 WaitGroup&#xff1f;2. 基本操作3. WaitGroup 示例4. 注意事项 三、Mutex 的使用1. 什么是 Mutex&#xff1f;2. 基本操作3. Mutex 示例 四、竞争条件示例与解决1. 竞争条件问题示例2. 使用 Mutex 解决竞争条件 五、使用 RWM…

FFMPEG录屏(19)--- 枚举Windows下的屏幕列表,并获取名称、缩略图

在Windows下枚举显示器列表并获取名称、缩略图 在Windows系统中&#xff0c;枚举显示器列表并获取它们的名称和缩略图是一个常见的需求。本文将详细介绍如何实现这一功能&#xff0c;涉及到的主要技术包括Windows API和C编程。 获取显示器信息 首先&#xff0c;我们需要一个…

爬虫结合项目实战

由于本人是大数据专业&#xff0c;所以准备的是使用pycharm工具进行爬虫爬取数据&#xff0c;然后实现一个可视化大屏 参考项目&#xff1a; 1.医院大数据可视化最后展示 2. 大数据分析可视化系统展示 代码包&#xff1a;

自由学习记录(13)

服务端常见的“资源” 在服务端&#xff0c;常见的“资源”指的是服务端提供给客户端访问、使用、处理或操作的各种数据和功能。根据不同类型的服务和应用场景&#xff0c;服务端的资源种类可以非常广泛。以下是一些常见的服务端资源类型&#xff1a; 1. 文件和静态资源 网页…

LSP的建立

MPLS需要为报文事先分配好标签&#xff0c;建立一条LSP&#xff0c;才能进行报文转发。LSP分为静态LSP和动态LSP两种。 静态LSP的建立 静态LSP是用户通过手工为各个转发等价类分配标签而建立的。由于静态LSP各节点上不能相互感知到整个LSP的情况&#xff0c;因此静态LSP是一个…

阿里云云盘在卸载时关联到PHP进程,如何在不影响PHP进程情况下卸载磁盘

1.问题&#xff1a; 在使用umount /dev/vdc1 卸载磁盘时&#xff0c;提示如下&#xff0c;导致无法在Linux系统下卸载磁盘 umount /dev/vdc1 umount: /var/www/html/*/eshop/IFile3: target is busy.(In some cases useful info about processes that usethe device is found…

NumPy学习Day18

1.数据迭代 1.1 nditer 使用np.nditer(x,order)遍历数组x中的元素 x为需要遍历的数组orderc’时按照行优先遍历orderf’时按照列优先遍历 1.2 flags参数 flags可以返回数组中元素的多维索引&#xff08;类似矩阵的坐标&#xff09; multi_index: 返回每个元素的多维索引。…

工具类的构造方法为什么要用private修饰

工具类&#xff08;Utility Class&#xff09;通常被设计为包含静态方法和静态变量的类&#xff0c;可以使用类名.方法名直接调用&#xff0c;不用进行实例化&#xff0c;这是工具类的设计原则&#xff0c;所以构造方法用private修饰&#xff08;因为公开的方法可以被实例化&am…

基于neo4j的糖尿病知识图谱数据

基于Neo4j的糖尿病知识图谱项目&#xff1a;毕业设计必备&#x1f4a1; 这个项目&#xff0c;专为需要深入挖掘医学或AI数据的朋友们量身定制&#xff0c;尤其适合用于毕业设计&#xff01;如果你对图谱构建、AI问答系统、或者正在学习Neo4j&#xff0c;那么你不得不看看这个技…

管家婆财贸ERP BB014.销售按库存选存货

最低适用版本: 财贸系列 22.8 插件简要功能说明: 销售按库存选存货插件,多元化价格跟踪体系用户根据存货+仓库自设仓库协议价仓库协议价支持手工或通过售价生成便捷录入销售单开单,无需选择客户,支持按存货查询库存余额及仓库协议价,选中存货即可将存货默认出库单位一级…

大厂物联网(IoT)高频面试题及参考答案

目录 解释物联网 (IoT) 的基本概念 物联网的主要组成部分有哪些? 描述物联网的基本架构。 IoT 与传统网络有什么区别? 物联网中常用的传感器类型有哪些? 描述物联网的三个主要层次。 简述物联网中数据安全的重要性 描述物联网安全的主要威胁 解释端到端加密在 IoT 中…

linux—基础命令及相关知识

1.0Linux的哲学思想&#xff08;优势&#xff09; 1、一切都是一个文件&#xff0c;一切硬件设备包括硬件接口都可以以文件形式显示 2、系统小型&#xff0c;轻量级&#xff0c;300个包&#xff08;不装桌面的情况下&#xff09; 3、避免令人困惑的用户界面&#xff08;图形…

在 Spring 中使用 @EhCache 注解作为缓存

文章目录 项目概况项目设置一个简单的 RESTful Web 服务Spring 整合 EhCache第 1 步&#xff1a;更新依赖项以使用 EhCache Spring 注解第 2 步&#xff1a;设置自定义缓存管理器第 3 步&#xff1a;配置 EhCache第 4 步&#xff1a;测试缓存 刷新缓存总结推荐阅读文章 EhCache…