当前位置: 首页 > news >正文

单链表的成环问题

       前言:链表成环问题不仅考察双指针的用法,该问题还需要一定的数学推理和分析能力,看似简单的题目实则细思缜密,值得斟酌~

目录

1.问题背景引入-判断链表是否成环:

1.1.正解:快慢指针

1.2 STL的集合判重

2.判断入环点问题

2.1.正解:快慢指针

思路分析

代码实现

2.2.相遇点断开判断相交点

思路分析

代码实现

3.金句频道


1.问题背景引入-判断链表是否成环:

1.1.正解:快慢指针

对于这个经典问题,一般的,我们得最优解法就是使用快慢指针,下面我们先来分析一下原理:

 

1.2 STL的集合判重

STL还是很好用的,只是会在时间和空间上比双指针算法性能差一些,但胜在思路简单清晰

class Solution {
public:bool hasCycle(ListNode *head) {//快慢指针/*ListNode *slow=head;ListNode *fast=head;bool result=false;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){result=true;break;}}return result;*///C++ STL的setset<ListNode *>mp;ListNode *p=head;while(p){if(!mp.count(p)){mp.insert(p);p=p->next;}elsereturn true;}return false;}
};

2.判断入环点问题

       如果我们需要判断是否成环并在成环前提下找出环的入口节点呢,诸位有什么好方法吗?可以先停下来思考片刻,

 这个题看起来容易,实际上需要用数学归纳法推出可行性的结论进行处理,我们来看。

2.1.正解:快慢指针

思路分析

我们还是用上面所讲的双指针算法,我们这里先给出结论:

  一个指针从相遇点开始走,一个指针从链表头开始走,它们会在环的入口点相遇.

下面我们来做一下推导证明: 

我们来假设下列条件:

根据上图所示,我们来看fast和slow分别走了多少步?

       首先,我们需要知道,fast和slow指针的相遇,会在slow在环内部转了几圈后再追上吗?

这个显然是不可能的,其原因,就是当slow开始进入环时,fast已经在环中的某个点上,此后slow每走一步,fast都会走slow所到节点的两倍,现在变成了fast从slow的背后追slow,并且,slow每走一步,fast都会从它背后追赶两步,造成了两者之间的距离每次缩小1,由于fast在开始追slow是就已经在环中了,所以不用一个环的长度,fast必然追上slow。

        这样一来就好算了,slow走的距离就是L+x,而fast走的距离就是L+C+x,我们可以根据2*slow=fast列出等量关系

                                            2(L+x)=L+C+x;

可以解得:L=C-x,

我知道你急,但是先别急~

如果我的链表是C=1,L=3呢?3=1-(-2)吗?很显然,这不符合逻辑,这是因为我们忽视了一个问题:当L>>C的时候,fast会在环中转很多次才能等到slow进入环中,我们假设这种情况下fast在slow进入环中之前已经转了n次,那么我们的fast走过的实际距离应该为

                                          fast=L+n*C+x;

     此时我们的等式变为:2*(L+x)=L+n*C+x

可以解得

                                        

                                               L=n*C-x;

我们将上面的结论反馈到图中

 进而,我们就可以得出结论,

一个指针从相遇点开始走,一个指针从链表头开始走,它们会在环的入口点相遇.

代码实现

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *slow=head;ListNode *fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){ListNode *meet=slow;//相遇节点//相遇节点和头结点同时走,相遇到的点就是入环节点while(head!=meet){head=head->next;meet=meet->next;}return head;}}return NULL;}
};

2.2.相遇点断开判断相交点

思路分析

       这个思路不难理解,只要我们将相遇点的下一个节点置为NULL,记住相遇点的下一个节点,然后和头结点一起遍历找出地址相同的节点即为入环节点:

代码实现

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *slow=head;ListNode *fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){//相遇节点//cout<<slow->val<<endl;//cout<<fast->val<<endl;ListNode *meetnext=slow->next; //cout<<meetnext->val<<endl;slow->next=NULL;//断开链表,然后开始找两个链表的相交节点//这里我为了方便,直接用STL来判重,写个链表求长度函数,然后将长的链表遍历到和短链表长度一致时再同时开始遍历也可以set<ListNode*> mp;ListNode *p1=head;ListNode *p2=meetnext;//步骤还可以优化while(p1||p2){if(p1&&!mp.count(p1)){mp.insert(p1);p1=p1->next;}else if(p1&&mp.count(p1))return p1;if(p2&&!mp.count(p2)){mp.insert(p2);p2=p2->next;}else if(p2&&mp.count(p2))return p2;}  }}return NULL;}
};

3.金句频道

想什么呢,向前走啊你

      你可以消沉,也可以抱怨,但希望天一亮,你又能顶住四面八方的压力,继续努力的好好生活。不要总抓着过去的事情不放,对那些受过的委屈和伤害耿耿于怀,以及在那些根本无法改变的人和事上面无谓的消耗自己,我们人生的进步就是我们的能力和我们的梦想一次次匹配。

 

相关文章:

单链表的成环问题

前言&#xff1a;链表成环问题不仅考察双指针的用法&#xff0c;该问题还需要一定的数学推理和分析能力&#xff0c;看似简单的题目实则细思缜密&#xff0c;值得斟酌~ 目录 1.问题背景引入-判断链表是否成环&#xff1a; 1.1.正解&#xff1a;快慢指针 1.2 STL的集合判重 …...

横截面收益率

横截面收益率指的是在经典资产定价模型中&#xff0c;在横截面上线性确定的一个与资产风险匹配的资产收益率。 横截面收益率的预测[1] (一)变量和方法 我们主要使用月度频率数据进行检验。交易数据和公司财务数据来自于CSMAR数据库。CSMAR数据库的收益率调整了送股、配股以及拆…...

C++解析JSON JSONCPP库的使用

首先去GitHub下载JSONCPP的源码&#xff1a; JSonCpp的源码 解压后得到&#xff1a;jsoncpp-master 文件夹 需要的是&#xff1a;jsoncpp-master\src\lib_json 目录下的所有文件和 jsoncpp-master\include\json 目录下的所有文件&#xff0c;在MFC工程目录下新建两个文件夹或…...

不会Elasticsearch标准查询语句,如何分析数仓数据?

1 Elasticsearch的查询语句 ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互&#xff0c;这种方式的丰富查询语法让ES检索变得更强大&#xff0c;更简洁。 1.1 查询预发 # GET /…...

获得GitHub Copilot并结合VS Code使用

一、什么是GitHub Copilot GitHub Copilot是一种基于AI的代码生成工具。它使用OpenAI的GPT&#xff08;生成式预训练Transformer&#xff09;技术来提供建议。它可以根据您正在编写的代码上下文建议代码片段甚至整个函数。 要使用GitHub Copilot&#xff0c;您需要在编辑器中…...

Java基础-判断和循环

1 流程控制语句 在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。所以&#xff0c;我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能。 1.1 流程控制语句分类 ​ 顺序结构 ​ 判…...

ESP32 FreeRTOS学习总结

2023.5.11 FreeRTOS中文数据手册&#xff1a;https://www.freertos.org/zh-cn-cmn-s/RTOS.html 感谢以下两位B站UP主的教程&#xff1a;孤独的二进制、Michael_ee 1.Task 创建任务常用API&#xff1a; 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreatePinne…...

uniapp打包ios保姆式教程【最新】

uniapp打包 打包方式ios打包一、前往官网登录二、添加证书 三、添加标识符(Identifiers)四、添加安装ios测试机(Devices)五、获取证书profile文件六、生成并下载p12文件七、开始打包 打包方式 安卓打包直接使用公共测试证书即可打包成功&#xff0c;简单方便&#xff0c;这里我…...

Thread线程学习(2) Linux线程的创建、终止和回收

目录 1.首先要了解什么是线程ID&#xff0c;以及它的作用是什么 2.创建线程 3.终止线程 4.回收线程 5.总结 在Linux系统中&#xff0c;线程是轻量级的执行单元&#xff0c;能够在同一个进程中并发执行。本文将介绍如何在Linux环境下创建、终止和回收线程&#xff0c;并提供…...

linux-项目部署软件安装

安装jdk 操作步骤&#xff1a; 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux jdk-8u171-linux-x64.tar.gz 2、解压安装包&#xff0c;命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local 3、配置环境变量&#xff0c;使用vim命令修改/etc/profile文…...

Vue3-黑马(三)

目录&#xff1a; &#xff08;1&#xff09;vue3-基础-计算属性 &#xff08;2&#xff09; vue3-基础-xhr-基本使用 &#xff08;3&#xff09;vue3-基础-xhr-promise改造 &#xff08;1&#xff09;vue3-基础-计算属性 上面有重复的代码&#xff0c;用计算属性&#xff0…...

标准C库函数fprintf(),sprintf(),snprintf()的函数使用方法(往文件中写入数据,将变量的值转换成字符串输出)

前言 如果&#xff0c;想要深入的学习标准C库中函数fprintf()&#xff0c;sprintf()&#xff0c;snprintf()&#xff0c;还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令&#xff1a; man 3 fprintf/sprintf/snprintf即可查阅到完整的资料信息。 fprintf 函数 fprin…...

不到1分钟,帮你剪完旅行vlog,火山引擎全新 AI「神器」真的这么绝?

旅行时&#xff0c;想在社交平台发布一支精美的旅行 vlog&#xff0c;拍摄剪辑需要花费多长时间&#xff1f; 20 分钟&#xff1f;一小时&#xff1f;半天&#xff1f; 在火山引擎算法工程师眼里&#xff0c;可能 1 分钟都用不了&#xff0c;因为会有 AI 替你完成。 没错&#…...

MySQL的概念、编译安装,以及自动补全

一.数据库的基本概念 1、数据&#xff08;Data&#xff09; • 描述事物的符号记录 • 包括数字&#xff0c;文字&#xff0c;图形&#xff0c;图像&#xff0c;声音&#xff0c;档案记录等 • 以“记录”形式按统一的格式进行存储 2、表 • 将不同的记录组织在一起 • …...

Jmeter常见问题和工作中遇到的问题解决方法汇总

一、标题Jmeter常见问题解决 1.1 Jmeter如何针对https协议进行接口测试&#xff1f; 解决方法&#xff1a; 协议更改为&#xff1a;https&#xff0c;端口号更改为443&#xff1b;Jmeter默认的是&#xff1a;http协议&#xff0c;端口号是&#xff1a;80 1.2 Jmeter如何解决默…...

蓝牙单连接和多连接知识

蓝牙单连接和多连接知识 生活中蓝牙连接多路蓝牙的情况越来越多&#xff0c;下面介绍下单连接和多连接的知识&#xff0c;供大家参考 一&#xff1a;蓝牙单连接 蓝牙单连接也称为Point-to-Point 点对点连接&#xff0c;是最常见的蓝牙连接场景,如手机<–>车载蓝牙。&…...

Mongodb—查询数据报错 Sort operation used more than the maximum 33554432 bytes of RAM

线上服务的MongoDB中有一个很大的表数据有十几万条。然后报了下面这个错误: “exception”:”org.springframework.data.mongodb.UncategorizedMongoDbException”, “message”:”Query failed with error code 96 and error message ‘Executor error during find command:…...

Java内存异常和垃圾回收机制

内存溢出异常 Java会存在内存泄漏吗&#xff1f;请简单描述 内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。理论上来说&#xff0c; Java是有GC垃圾回收机制 的&#xff0c;也就是说&#xff0c;不再被使用的对象&#xff0c;会被GC自动回收 掉&#xff0c;自动…...

linux系统挂载逻辑卷和扩展逻辑卷组

fdisk /dev/vdb fdisk /dev/vdc在分区后需要修改分区类型为 8e&#xff0c;操作过程类似&#xff1a; [rootlocal ~] $ fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command actiona tog…...

WPF:WPF原生布局说明

前言 WPF在国内讨论度很小&#xff0c;我在这里记录一下WPF简单的原生控件是如何使用的&#xff0c;顺便回忆一下WPF的基础知识&#xff0c;有些忘记的比较厉害了 WPF简介 WPF是微软推出的桌面UI软件&#xff0c;是我觉得最早实现MVVM&#xff08;数据驱动事务&#xff09;&…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...