LeetCode_(兜兜转转还是你)浪漫的环形链表问题

devtools/2024/9/20 7:16:20/ 标签: 链表, 数据结构, leetcode

✨✨所属专栏:LeetCode刷题专栏✨✨

✨✨作者主页:嶔某✨✨

 第一题:

 这道题的代码很简单,但是后续的一些问题在思考的过程是很复杂的。下面我们就一起来分析一下吧!

 链表带环的意思就是说链表的某个节点的next指针指向了前面的某个节点(如图),当然、在极端情况下,也可能指向自己。我们在做题的时候可以将上图抽象成下图:

 快慢指针:我们定义两个指针fast、slow都指向头节点,每一次循环让fast走两步,slow走一步。

(1)链表中带环:那么fast先进环,slow后进环。这时就变成了追及相遇问题了,如果最后fast指针等于slow指针,那么说明链表带环,返回true。

(2)链表中不带环:如果fast走向空指针了,说明链表不带环,返回false。所以我们以fast和fast的next不为空为循环条件。

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

 那么接下来,我们思考这样一个问题:先前我们是让fast一次走两步,slow一次走一步。那如果fast一次走三步、四步、五步呢?

这里我们讨论fast一次走三步的情况:

 假设当slow也进环时,fast于slow指针之间的节点个数为 N 这里就有两种情况:

(1)N为偶数:那么距离变化:N -> (N-2) -> (N-4) ->......-> 4 -> 2 -> 最后fast == slow。

(2)N为奇数:距离变化:N -> (N-2) -> (N-4) ->......->3 -> 1 -> (-1)最后还是错过了……

我们不仅追不上,在一些步数差上,我们还会在接触后渐行渐远……

 我们爱的奋不顾身,殊不知,这正好让我们渐行渐远……

那么当N为奇数时,错过后就真的没有挽回的余地了吗?我们接着分析:

当fast和slow之间的距离为 -1 时,实际上它们之间的距离为: (C - 1)

(1)我们之间又开始了下一段追及相遇,同上,当 (C - 1)为偶数时,刚好追上。

(2)当 (C - 1)为奇数时就永远追不上了。因为(C - 1)为奇数,下一次我们也必然会错过,一旦错过就是万劫不复……

所以这里我们得出结论当N为奇数且C为偶数时:他们两个永远也追不上彼此。

但……真的是这样吗?或者说你真的甘心就是如此了吗?

C和N有没有可能都为奇数或者都为偶数呢?

我们不妨继续分析

假设当slow进环的时候,fast已经在环里面转了x圈了,这时fast指针走的总路程为:

L + x*C + N

而slow只走了 L 这么长的距离,由于slow每次走一步,fast每次走三步,所以fast走的路程为slow的三倍,我们得到以下关系:

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

 整理一下:

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

等号左边为偶数,如果N为奇数,C为偶数,一个偶数减一个奇数,不可能为偶数。所以不可能同时满足N为奇数、C为偶数或者C为奇数、N为偶数。

只能是它们两个同时为奇数或者同时为偶数。

所以我们一定会再次相遇……

 就算我们错过了,亲爱的,我们还会遇见的……

 第二题:

 这道题的代码也很简单,但是思考的过程是很复杂的,我们一起来分析一下:

这里我们要确定入环的第一个节点这里有一个O(n^2)的算法,就是将链表的每一个节点都判断一下然后让一个指针一直往后走,如果最终这个指针和此节点相等了,那么此节点就是要寻找的第一个节点。

但是此算法太过复杂,有没有更好一点的算法呢?

这里我们给出一种代码简单的算法:

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

我们让一个节点在快慢指针的地方开始,另一个指针从头节点开始走,它们相遇的地方就是入环的第一个节点。

为什么呢?

 老样子,我们来分析一下:

当fast和slow相遇时:

fast走过的路程为:L + x*(C) + N

slow走过的路程为:L + N

而fast走的步数是slow的二倍,我们就有:

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

整理一下:

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

这个试子就很好的说明了为什么head和meet会在入环节点相遇。

当x = 1时:meet正好走完C - N的路程后就与head再入环节点相遇

当x > 1时:meet走了(x - 1)圈后再走(C - N)就会和head在入环节点相遇

  本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!


http://www.ppmy.cn/devtools/23547.html

相关文章

SparkSQL---简介及RDD V.S DataFrame V.S Dataset编程模型详解

一、SparkSQL简介 SparkSQL,就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL,而叫Shark,最开始的时候底层代码优化,sql的解析、执行引擎等等完全基于Hive,总之Sha…

7-云原生监控体系-PromQL-函数功能和示例

Prometheus支持几个函数来操作数据。 文章目录 1. 函数语法解释2. count(v instant-vector)3. topk(n, v instant-vector)4. bottomk(n, v instant-vector)5. increase(v range-vector)6. rate(v range-vector)7. rate 和 increase8. irate(v range-vector)9. predict_linear(…

Qt开发 , new一个QDialog窗口,点击关闭按钮,内部定义QTimer指针未释放 同时 析构函数也未调用问题

在Qt中,当创建一个QDialog的实例并显示它时,按下关闭按钮(或点击窗口右上角的“X”按钮)会触发窗口的关闭事件,但并不会立即调用其析构函数。这是因为Qt的窗口部件管理内存的方式是基于引用计数的,并且QDia…

[typescript] 引入js说找不到模块或其相应的类型声明

声明自己的js模块就行 你不想全部引入?那就声明引入

「51媒体」2024年北京有哪些媒体邀约资源

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 北京的媒体邀约资源非常丰富,涵盖了多种类型的平台,包括但不限于: 广播电视台:总台,北京地方电视台,教育电视台&am…

状态模式

文章目录 1.UML类图2.状态基类3.状态实现类3.状态机管理类使用示例 1.UML类图 2.状态基类 public abstract class State {public string? Name { get; set; }public StateMachine? StateMachine {get; set;}public abstract void Exit();public abstract void Enter(); }3.…

Idea实现远程debug调试

创建demo package com.merchen.hello_world.controller;import org.springframework.web.bind.annotation.*;RestController RequestMapping("/res") public class ResController {GetMapping("/test/{value}")public String testController(PathVariable…

自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王,侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦,将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念: 运动学方程 建立微分方程 主要是弄…

力扣HOT100 - 207. 课程表

解题思路&#xff1a; class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] inDegree new int[numCourses];//存每个结点的入度List<List<Integer>> res new ArrayList<>();//存结点之间依赖关系Queue<Integer>…

Pulsar【部署 02】Pulsar可视化工具Manager安装使用

Pulsar Manager 是一个基于 web 的 GUI 管理和监视工具&#xff0c;可帮助管理员和用户管理和监视租户、命名空间、主题、订阅、代理、集群等&#xff0c;并支持对多个环境进行动态配置。 可视化工具Manager安装使用 1.Docker1.1 拉取镜像并启动1.2 设置用户名密码1.3 登录并添…

CSS Position定位(详解网页中的定位属性)

目录 一、Position介绍 1.概念 2.特点 3.作用 4.应用 二、Position用法 1.position属性 2.static定位 3.fixed定位 4.relative定位 5.absolute定位 6.sticky定位 7.重叠的元素 三、CSS定位属性 四、总结 一、Position介绍 1.概念 文档流&#xff08;Document Fl…

java实现模板填充word,word转pdf,pdf转图片

Java实现Word转PDF及PDF转图片 在日常开发中&#xff0c;我们经常需要将文件操作&#xff0c;比如&#xff1a; 根据模板填充wordword文档中插入图片Word文档转换为PDF格式将PDF文件转换为图片。 这些转换可以帮助我们在不同的场景下展示或处理文档内容。下面&#xff0c;我将…

【经典面试题】Vue3和Vue2有什么区别?

在这篇博客中&#xff0c;我们将深入探讨 Vue 2 和 Vue 3 之间的主要差异&#xff0c;并通过示例代码来展示这些差异。 1. 架构变化 Vue 3 引入了一种新的内部架构&#xff0c;使用 Proxy 替代了 Vue 2 中的 Object.defineProperty。这个变化带来了性能的提升和更好的内存管理…

小米消金强化普惠金融举措,构建消费者反诈安全屏障

近年来&#xff0c;随着通信技术的飞速发展&#xff0c;电信网络诈骗作为一种非接触性犯罪形式&#xff0c;给广大消费者带来了严重的经济损失&#xff0c;并对金融秩序造成了极大的破坏。为了应对这一严峻挑战&#xff0c;重庆小米消费金融有限公司&#xff08;以下简称“小米…

容器Docker:轻量级虚拟化技术解析

引言 随着云计算和虚拟化技术的飞速发展&#xff0c;容器技术以其轻量级、高效、可移植的特性&#xff0c;逐渐成为了软件开发和部署的新宠。在众多容器技术中&#xff0c;Docker以其简单易用、功能强大的特点&#xff0c;赢得了广泛的关注和应用。本文将全面介绍Docker的基本概…

qml基本元素使用

目录 常用元素可视元素Rectangle 绘制矩形区域Text 显示文本Image 显示图像。TextInput 接受用户输入的文本框。Button 响应用户点击的按钮。CheckBox 处理用户选择的复选框。RadioButton 处理用户选择的单选按钮。 非可视元素Item 所有可视元素的基类&#xff0c;但它本身不显…

如何将本地项目上传到Github(SSH方式)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

贸易管理软件品牌整理「2024」

贸易管理软件2024品牌整理有&#xff1a;孚盟MX贸易管理软件、Xero贸易管理软件、Sage贸易管理软件&#xff0c;以及供应链管理软件如SAP、Oracle SCM、Infor等。 贸易管理软件的主要功能包括订单管理、供应链管理、财务管理、物流管理等多个方面。通过集成这些功能模块&#…

Blender常见操作

1.局部视图&#xff1a;Local View&#xff0c;也可称作Solo模式&#xff0c;按快捷键 “/”进入&#xff0c;在按退出&#xff0c;只显示选中的物体&#xff08;可多选&#xff09;&#xff0c;方便编辑 2.物体合并&#xff1a;Ctrl J 其中&#xff0c;当选中多个物体时&am…

数据仓库实验二:关联规则挖掘实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、创建数据库和表2、挖掘关联规则&#xff08;1&#xff09;新建一个 Analysis Services 项目 Sales&#xff08;2&#xff09;建立数据源视图&#xff08;3&#xff09;建立挖掘结构 Sales.dmm&#xff08;4&#xff09;部署…