力扣141.环形链表142.环形链表Ⅱ 附证明

题目链接:

141. 环形链表 - 力扣(LeetCode)

142. 环形链表 II - 力扣(LeetCode)

141.环形链表

方法思路:快慢指针

代码:

class Solution {
public:bool hasCycle(ListNode *head) {if(!head){return false;}ListNode * slow=head;ListNode * fast=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;if(fast==slow){return true;}}return false;}
};

解析:
        用到了快慢指针,定义两个指针,slow指针和fast指针,令slow一次走一步,fast一次走两步,可以证明只要有环,则fast与slow一定能相遇。

证明:

1.fast一次走两步,slow一次走一步时:

假设一个环形链表如下:

令slow和fast初始都指向链表头结点head

---------------------------------------------------------------------------------------------------------------------------------

slow进环后,fast开始追击slow

---------------------------------------------------------------------------------------------------------------------------------

某一时刻时就会相遇

---------------------------------------------------------------------------------------------------------------------------------fast一次走两步,slow一次走一步,在环内一定可以相遇的证明:

(1).假设当slow刚进入环时,slow与fast距离差为N

(2). 当fast一次走两步,slow一次走一步,则N变为了N-1,每追击一次,slow与fast之间的距离缩小1个距离,则N最终会变为0。则可证明slow与fast一定可以相遇。

2.fast一次走三步,slow一次走一步时:
 

(1).还是假设slow刚进环时,slow 与 fast相遇距离为N。

(2).fast走三步,slow走一步,距离变化为:

                                                N-2  ->  N-4  ->  N-6..........以2递减。

(3).当N是2的倍数时,N最终会变为0,则可以相遇。

(4).当N不是2的倍数时,我们需要设环长为C。N会先变成-1,则fast超过了slow,如图:

        则此时fast与slow的距离成为了C-1,则当C-1为2的倍数时,则slow与fast一定可以相遇。

结论:若N为2的倍数,则一定可以相遇。若N不是2的倍数时,当C为奇数时(C-1为偶数),一定可以相遇。

总结:

1.N是偶数,第一轮就追上了。

2.N是奇数,第一轮会错过,距离变为C-1

        (1).如果C-1是偶数,下一轮就追上了。

证明是否永远追不上:

即N为奇数,C-1也为奇数时,是否存在?

先设环长为C,设当slow刚进环时,走了L距离,fast与slow距离为N,则fast已经在环内转了x圈。

则   slow走的距离:L        fast走的距离:L+x*C+C-N;

又因为fast走的距离是slow的三倍,所以3*L=L+x*C+C-N

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

又因为假设N为奇数C为偶数时,则 2*L一定是偶数,则等号右侧也应该为偶数,但是(x+1)*C

为偶数,N为奇数,则右侧为奇数(偶数-奇数),显然出现矛盾,等号左侧一定是偶数,而等号右侧为奇数,所以出现矛盾。N为奇数且C为偶数不成立!!!即一定能追上!

结论:一定能追上

N为偶数时第一轮就追上了。

N是奇数时第一轮追不上,C-1是偶数第二轮就追上。

142.环形链表Ⅱ

方法思路:还是用快慢指针,找到快慢指针在环中相遇的结点,把这个结点存储起来,再令链表头结点和相遇的结点一起向前走,当头结点与相遇结点相遇时的结点,就是环的入口。

代码:

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode * fast=head;ListNode * slow=head;while(fast && fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow){ListNode * next=fast;while(next != head){head=head->next;next=next->next;}return next;}}return NULL;}
};

证明:

当快指针一次走两次,慢指针一次走一次。

slow与fast相遇时 就证明L=C-N即可

slow 走的路程:L+N

fast  走的路程:L+x*C+N

因为fast的路程是slow的二倍,则2*(L+N)=L+x*C+N

                                                                                        L+N=x*C

                                                                                        L=x*C-N

当x=1时,则L=C-N

当x!=1时, 则由于C是圆环周长,则大于1圈的时候就相当于1圈,转整圈还是会到达meet处。

则可证明L=C-N成立

完结撒花
 

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

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

相关文章

Nodejs内存管[Mark-Sweep算法][Mark-Compact]

内存控制 Mark-Sweep & Mark-Compact 对于老生代的对象,存活对象占较大的比重,采用scvenge方法会存在如下问题 1. 存活对象较多,复制存活对象的效率很低 2. 浪费一半空间的问题因此v8在老生代中主要采用了Mark-Sweep和Mark-Compact相结…

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳: 1)用1个小粒度的模式,逐个与图像的局部区域进行运算,运算结果反映模式与区域的匹配程度。 2)卷积神经网络与全连接神经网络的区别: 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

五款优秀的局域网监控软件推荐:实时监控电脑屏幕的神器

在现代社会,计算机和网络已经成为工作中不可或缺的部分。随着局域网的普及,如何有效地监控和管理局域网内的电脑成为了许多企业和管理者关心的问题。本文将为您推荐五款优秀的局域网监控软件,帮助您实时监控电脑屏幕,提高工作效率…

2023陇剑杯-流量分析篇-wp

1.ez_web Q1:服务器自带的后门文件是什么? 常用http过滤命令:http.request.full_urihttp.request.methodPOST 查看第一个POST请求,发现关键点file_put_contents(备注:file_put_contents内置函数,用于将字…

访学/博后/联培博士关注|不同国家的英语口音辨识度训练

在访问学者、博士后及联合培养的申请过程中,接收方多数都要求英文面试。如果导师的母语为非英语国家,将会带有口音,这样更增加了英语面试难度。如何提升不同国家的英语口音辨识度,使自己的英语表达更加流利,知识人网小…

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦 一、前情提要二、目标三、技术方案3.1 读写擦的操作3.1.1 读卡操作3.1.2 写卡操作3.1.3 擦除操作 3.2 一些技术点3.2.1 轮询标志位的选择不唯一3.2.2 写和擦的卡状态查询3.2.3 写的速度 四、代…

轨道交通巡检机器人的应用范围

在现代轨道交通系统的庞大网络中,无数的轨道、设备和设施交织在一起,如同一个精密的机器在高效运转。而在这背后,轨道交通巡检机器人正悄然登场,它们如同一个个智能的守护者,穿梭于各个场景之中。那么,这些…

python从0开始学习(三)

目录 前言 1、类型转换 1.1 隐式类型转换 1.2 显式类型转换 2、eval函数 总结 前言 上篇我们讲了python中的变量与常量,以及变量类型。本篇文章将接着往下讲。 1、类型转换 python中的数据类型转换包括两种:隐式类型转换和显式类型转换。 1.1 隐式…

SAPUI5基础知识1 - 概览,库,支持工具,自学教程

1. SAPUI5 概览 1.1 SAPUI5 SAPUI5是一种用于构建企业级Web应用程序的开发框架。它是由SAP开发的,基于HTML5、CSS3和JavaScript技术。 SAPUI5提供了一套丰富的UI控件和工具,使开发人员能够快速构建现代化、可扩展和可定制的应用程序。 它还提供了数据…

西门子数控网络IP设定配置

总结:menuselect-诊断-屏幕下方右翻页找到tcp/ip,进去选择tcp/ip诊断,进去选择x130网口,点击更改, 如果没有更改,menuselect-调试-口令,输入口令 sunrise 然后重新配置tcp/ip,配置完…

Qt 6 开源版(免费) -- 在线安装图解

经常遇到询问:有没有Qt6安装包? ......,真没有呢~~ 从Qt6起,它整了两个重大改变(并非指技术): 在线安装,不再提供单独的安装包主推收费的商业版 当然的,为了培养市场…

SPSS之聚类分析

SPSS中系统聚类分析功能在【分析】—【分类】—【系统聚类】中完成。系统聚类有两种类型,一种是对样本进行聚类,称为Q型聚类;一种是对变量进行聚类,称为R型聚类。在【系统聚类分析】—【聚类】框下选择【个案】——Q型聚类&#x…

微信小程序生成二维码加密(CryptoJS4.0加密PHP8.0解密)AES方式加密

1、小程序创建 crypto-js.js和crypto.js两个文件(点击文件即可) 2、小程序js页面引入 var crypto require(../../utils/crypto.js);//注意路径是否正确3、使用 let data {id: that.data.id,name: dx}console.log(JSON.stringify(data))console.log(&…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错,如何知道是 哪个 symbols 不对呢? 今天探索到下面的方法: 1、点击导航上方 最右侧的按钮,查看历史报错 2、选中报错信息,右键选择 Expand All Transcripts 在出现的详细信息面…

FreeRTOS软件定时器(1-18)

软件定时器简介 定时器:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义 定时器周期。 硬件定时器:芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时…

Java常用命令总结 持续更新中!!!

蓝桥杯JAVA组 推荐输入输出示例 // 基础输入 import java.util.*;public class Main{public static void main(String[] args){} }// 非静态方法调用 new Main.Solution();//static函数里面调用非static函数 类.函数// 更快的输入方式 BufferedReader // 更快的输出方式 Print…

js监听页面的显示和隐藏

下方微信公众号 和微信小程序推荐 js监听页面的显示和隐藏 在JavaScript中,监听页面的显示和隐藏可以通过监听visibilitychange事件来实现。visibilitychange事件会在页面的可见性发生变化时触发。 以下是一个简单的示例,演示如何使用visibilitychan…

《面向对象程序设计及C++》实验报告

《面向对象程序设计及C》实验报告 一、实验目的与实验要求 (1)掌握类的定义、类中成员函数的定义和使用、构造函数和析构函数的定义、功能;掌握对象的使用方法。 (2)掌握静态数据成员、静态成员函数的功能和使用方法…

Linux —— 信号初识

Linux —— 信号初识 什么是信号测试几个信号signal函数函数原型参数说明返回值注意事项示例 后台程序前台转后台检测输入中断向量表 我们今天来继续学习Linux的内容,今天我们要了解的是Linux操作系统中的信号: 什么是信号 信号是操作系统内核与进程之…

判断dll/lib是32/64位、查看lib是导入库/静态库的方法 、查看dll包含的符合、lib包含的函数

一、判断dll/lib是32/64位 原文链接:https://www.cnblogs.com/bandaoyu/p/16752602.html 1. 简便方法: 直接用记事本或者notepad(或txt文本)打开exe文件(dll文件),会有很多乱码,不要头疼,接下…