力扣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成立

完结撒花
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机编程实例400例大全(1-100)

最近有一些新手,咨询我去实现某个功能,没思路,无从下手,怎么办? 平时太忙,没时间一一解答,今天发篇文说下。 这是每个人必经的阶段,不必自责和焦虑。 我是如何解决这个问题的&#x…

Postman 汉化安装及使用指南:快速上手 Postman 中文版

Postman 是一款常用的 API 测试工具,可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化,包括每个步骤的详细说明。 下载安装 Postman 1、打开浏览器,访问 Postman 官网,下载适用于自己系统的…

(el-Transfer)操作(不使用 ts):Element-plus 中 Transfer 穿梭框右侧数据不展示的问题

Ⅰ、Element-plus 提供的Transfer树形控件组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供Transfer组件情况&#xff1a; 其一、Element-ui 自提供的Transfer代码情况为(示例的代码)&#xff1a; <template><p style"text-align: center; margin: …

Nacos原理-2024

文章目录 1. 什么是Nacos2. 注册中心原理3. 配置中心原理 1. 什么是Nacos Nacos注册中心分为server与client&#xff0c;server采用Java编写&#xff0c;为client提供注册发现服务与配置服务。而client可以用多语言实现&#xff0c;client与微服务嵌套在一起&#xff0c;nacos…

让大模型prompt生成Mermaid流程图

生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 SVG 形式的图形 kimi效果示例&#xff1a; 使用…

【算法一则】【动态规划】求二维数组可组成的最大正方形

题目 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0&…

大模型应用开发极简入门

简单的归纳一下书的前序部分 目录 LLM&#xff08;Large Language Model&#xff09;的应用技术栈通常包括以下几个方面&#xff1a; 深度学习框架&#xff1a; 数据预处理工具&#xff1a; 训练资源&#xff1a; 模型优化和调参工具&#xff1a; 部署和应用集成&#xf…

最新AI实景无人自动直播软件:一部手机就可以实现无人直播;商业拓客带货的必备利器

智享实景无人直播系统在商业拓展中的作用不可忽视。本文将探讨该系统的特点和优势&#xff0c;展示其省时省力的优势以及在商家拓客和源头公司项目招商中的关键作用。 随着人工智能技术的飞速发展&#xff0c;智能化解决方案正逐渐渗透到各行业&#xff0c;在商业拓展领域取得了…

刷题训练之位运算

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握位运算算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

数据库分库分表

数据库分库分表 分库分表到底是什么 分库分表其实是分库,分表,分库分表的总称 分库 将数据按照一定规则存储到不同的数据库中,每个数据库存储一部分数据 分库主要解决的是并发量过大的问题&#xff0c;并发量一旦上升&#xff0c;那么数据库就可能成为系统的瓶颈&#xff…

综合性练习(后端代码练习2)——用户登录

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 1、输入账户密码界面 2、当前登录的用户界面 三、实现服务端代码 四、调整前端页面代码 1、login.html代码&#xff1a; 页面跳转的三种方式&#xff1a; 2、index.html代码&#xff1a; 五、运…

[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目&#xff1a; 现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能 力&#xff0c;B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等&#xff0c;允许从每组各选出一个CPU进行一次交换。 求两…

计算机网络----第十三天

DNS协议和文件传输协议 DNS&#xff1a; 含义&#xff1a;用于域名和IP地址的互相解析 DNS域名&#xff1a; 背景&#xff1a;通过IP地址访问目标主机&#xff0c;不便于记忆 域名的树形层次化结构&#xff1a; ①根域 ②顶级域&#xff1a;主机所处的国家/区域&#xf…

个人学习资源整理

文章目录 视频相关stl源码讲解相关 网站相关CPP网站 视频相关 stl源码讲解相关 跳转 网站相关 CPP网站 https://cplusplus.com/ https://gcc.gnu.org/

PostgreSQL的扩展(extensions)-常用的扩展之pg_repack

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展之pg_repack pg_repack 是一款非常有用的 PostgreSQL 扩展工具&#xff0c;它能够重新打包&#xff08;repack&#xff09;表和索引以回收空间并减少碎片&#xff0c;而且在这个过程中不会锁定表&#xff0c;允…

软件测试常问的超高频面试题目,2022最强版,附答案

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&…

基于Vue3的Axios异步请求

基于Vue3的Axios异步请求 1. Axios安装与应用2. Axios网络请求封装3. axios网络请求跨域前端解决方案server.proxy 1. Axios安装与应用 Axios是一个基于promise的网络请求库&#xff0c;Axios.js.中文文档&#xff1a;https://axios.js.cn/ 安装&#xff1a;npm install --sa…

Apollo Dreamview+之Studio插件安装

步骤一&#xff1a;登录 Apollo Studio 工作台 登录 Apollo Studio 工作台。 步骤二&#xff1a;获取插件安装链接 在账户信息中&#xff0c;单击 我的服务 。 2. 选择 仿真 页签。 3. 在 插件安装 中单击 生成 &#xff0c;选择 Apollo 最新版本&#xff0c;并单击 确定 。…

计算机视觉大项目(1)-水果分级系统

项目来源&#xff1a;河北大学计算机视觉课程-杨老师. 一共有四个标题&#xff0c;本篇博客只完成前两问。 目录 实验目的: 实验内容&#xff1a; 实验步骤&#xff1a; 1.水果图像的分割 >掩膜图像Mask 是什么&#xff1f; >改进:去除反光部分的影响 2&#xf…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments&#xff0c;获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…