【C++】LeetCode:LCR 022. 环形链表 II

题目:

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

官方示例:


分析:

第一步,快慢指针判断是否有环,顺便找到相遇点位置;

第二步找到入环点;


第一步:

快慢指针遍历,相遇前是否能遍历到空,遍历到空指针就说明无环,相遇了就是有环(因为快指针从后面追上了慢指针。)

第二步:

主要是理解为什么代码中重定向了慢指针(重定向哪个指针不重要,主要是理解为什么a=c)

设链表起始点到入环点的距离为 a。

slow 指针进入环后,又走了 b 的距离与 fast 相遇。

相遇点到入环点的距离为c。

需要理解a=c,以下为推导。

设fast 指针已经走完了环的 n 圈,因此它走过的总距离为:

             a+n(b+c)+b=a+(n+1)b+nc

因为快慢指针,fast 指针走过的距离都为 slow 指针的 2 倍。因此有:

             a+(n+1)b+nc=2(a+b)

移项化简:

             a=c+(n−1)(b+c)

因为b+c正好为环的一圈,

所以无论n为多少,都相当于快指针转了(n-1)圈又回到相遇点,即(n-1)(b+c)可以直接忽略

(说白了就是转一圈又回原地了,相当于没走)

        所以: a=c

理解起始点到入环点和相遇点到入环点的距离相等后,就可以明白算法中重定向slow指针的原因是什么了。

// 找到环的入口slow = head;while (slow != fast) {slow = slow->next;fast = fast->next;}

重定向慢指针后,由于a=c,重定向后快慢指针每次都移动一格,正好可以在入环点相遇。

举例:

链表:[1,2,3,4,5,6,7,8,9], 入环点为3

(下面是我画的丑图)

分步:

  1. 初始状态

    • slow = 1fast = 1
  2. 第一次移动

    • slow = 2fast = 3
  3. 第二次移动

    • slow = 3fast = 5
  4. 第三次移动

    • slow = 4fast = 7
  5. 第四次移动

    • slow = 5fast = 9
  6. 第五次移动

    • slow = 6fast = 4fast 绕了一圈回到 4)。
  7. 第六次移动

    • slow = 7fast = 6
  8. 第七次移动

    • slow = 8fast = 8fast 再次绕了一圈,此时 slow 和 fast 相遇在节点 8)。

题解:

class Solution {
public:ListNode *detectCycle(ListNode *head) {if (!head || !head->next) return nullptr;ListNode *slow = head, *fast = head;bool hasCycle = false;// 检测是否存在环while (fast && fast->next) {slow = slow->next;fast = fast->next->next;if (slow == fast) {hasCycle = true;break;}}// 如果没有环,返回 nullptrif (!hasCycle) return nullptr;// 找到环的入口slow = head;while (slow != fast) {slow = slow->next;fast = fast->next;}return slow;  // 返回环的入口节点}
};

复杂度:

  • 时间复杂度O(n),其中 n 是链表的长度。
  • 空间复杂度O(1),只使用了常数级别的额外空间。

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

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

相关文章

Windows环境中Python脚本开机自启动及其监控自启动

1 开机自启动 Windows 10/Windows Server 201X具有一个名为“启动”的已知文件夹,系统每次启动开始自动运行应用程序、快捷方式和脚本时都会检查该文件夹,而无需额外配置。 要在Windows启动时运行脚本,先使用WindowsR快捷键打开“运行”对话…

基于JavaSwing的贪吃蛇项目(最新项目)

Java贪吃蛇游戏 目录 文章目录 Java贪吃蛇游戏目录第一章 项目概述1.1 设计背景1.2 设计目的1.3 开发环境 第二章 需求分析2.1 功能需求2.1.1 基础功能2.1.2 扩展功能 2.2 性能需求2.3 用户体验需求 第三章 概要设计3.1 系统架构3.1.1 总体架构3.1.2 类设计 3.2 核心算法设计3…

SpringBoot 赋能:精铸超稳会员制医疗预约系统,夯实就医数据根基

1绪论 1.1开发背景 传统的管理方式都在使用手工记录的方式进行记录,这种方式耗时,而且对于信息量比较大的情况想要快速查找某一信息非常慢,对于会员制医疗预约服务信息的统计获取比较繁琐,随着网络技术的发展,采用电脑…

基于FPGA的智能电子密码指纹锁(开源全免)

基于FPGA的智能电子密码指纹锁 一、功能描述硬件资源需求 二、整体框架知识准备AS608指纹模块4*4数字键盘模块 三、Verilog代码实现以及仿真验证1.AS608_data模块2.check_hand模块3.four_four_key模块4.check_mima模块5.change_mima模块6.seg_ctrl模块7.uart_top模块8.key_debo…

动态计算加载图片

学习啦 别名路径:①npm install path --save-dev②配置 // vite.config,js import { defineConfig } from vite import vue from vitejs/plugin-vueimport { viteStaticCopy } from vite-plugin-static-copy import path from path export default defineConfig({re…

精确的单向延迟测量:使用普通硬件和软件

论文标题:Precise One-way Delay Measurement with Common Hardware and Software(精确的单向延迟测量:使用普通硬件和软件) 作者信息:Maciej Muehleisen 和 Mazen Abdel Latif,来自Ericsson Research Eri…

基于Java+Swing+Mysql的网络聊天室

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能!本章我们来学习 Linux 下的音频应用编程,音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升,但是笔者仅向大家介绍 Li…

【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转

读写分离功能的背景及架构 当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而…

视频自学笔记

一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像,以前所接触的电影、电视都是模拟信号,之所以将它们称为模拟信号,是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…

操作系统——大容量存储结构

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt,仅供学习交流使用,谢谢。 大容量存储结构概述 磁盘 磁盘为现代计算机系统提供大量外存。每个盘片为平的圆状(类似CD),普通盘片直径为4.5~9.0厘米。盘片的两面都涂着…

CSS一些小点 —— 12.7

1. box-sizing: border-box box-sizing 属性,默认值为 content-box box-sizing: border-box 使padding和border的值不会再影响元素的宽高;padding和border的值算在指定宽高的内部(但是外边距依然算做外部) 2. overflow: hidden …

【GESP】C++一级练习 luogu-P1425, 小鱼的游泳时间

GESP一级综合练习,主要涉及时间计算,难度★☆☆☆☆。 题目题解详见:https://www.coderli.com/gesp-1-luogu-p1425/ 【GESP】C一级练习 luogu-P1425, 小鱼的游泳时间 | OneCoderGESP一级综合练习,主要涉及时间计算,难…

【网络协议栈】数据链路层(内附手画分析图 简单易懂)以太网、MAC地址、局域网、交换机、MTU、ARP协议

每日激励:【无限进步】“梦想可以大,但第一步总是小” 绪论​: 本章将开始到达TCP/IP协议中的最后一层数据链路层,本章将会写到我们日常中常见的局域网以及认识数据链路层中非常重要的协议ARP协议,后续还将进行更新网络…

二叉树的深搜(不定期更新。。。。。)

二叉树的深搜 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉…

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序,此时需要接触到IAP编程。 IAP即为In Application Programming,解释为在应用中编程,用户自己的程…

使用setsockopt函数SO_BINDTODEVICE异常,Protocol not available

前言 最近在使用OLT的DHCP Server的时候发现一些异常现象,就是ONU发的一个vlan的discover包其他不同vlan的DHCP地址池也会收到,导致其他服务器也发了offer包,ONU同时会有多个ip地址。一开始是没有使用SO_BINDTODEVICE,后面查到使…

02 conda常用指令

目录 命令快速查找命令详细解释列出当前conda中存在的解释器环境使用指定的解释器环境创建虚拟环境激活自己创建的虚拟环境虚拟环境删除切换回主环境找到你计算机中安装的miniconda3的跟目录找到虚拟环境的目录选择需要删除的虚拟环境文件夹确认环境是否删除 补充删除虚拟环境指…

BEVFormer详细复现方案

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建

水下无人航行器数字样机功能模型构建 一、项目背景 为响应水下装备系统研制数字化转型及装备系统数字样机建设的需要,以某型号水下无人航行器(Underwater Unmanned Vehicle,UUV)为例,构建UUV数字样机1.0功能模型。针对…