leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

news2024/11/19 9:30:05

⭐️ 环形链表 I 题目描述

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
如果链表中存在环 ,则返回 true 。 否则,返回 false
在这里插入图片描述
思路:快慢指针问题。我们可以声明一个 fast 指针(一次走两步),声明一个 slow 指针(一次走一步)。如果链表中存在环,那么 fast 指针和 slow 指针就会相遇,如果相遇则代表有环,否则 fast 指针会结束代表没环。

🌠 为什么快指针走两步,慢指针走一步可以相遇?

图:
在这里插入图片描述
在这里插入图片描述

假设 slow 进环后,fastslow 距离是 N N N。这时候 fast 开始追击 slowfast 一次走两步,slow一次走一步,他们之间的距离每次缩小 1 1 1NN-1N-2...210最终他们相遇了,所以结论是肯定会相遇,因为他们的距离每次缩小 1 1 1

🌠 那快指针一次走三步,慢指针走一步可以相遇吗?

在这里插入图片描述
还是假设 slow 进环后,fastslow 距离是 N N N。这时候 fast 一次走三步,slow 一次走一步,他们之间的距离每次缩小 2 2 2

  1. N N N 是偶数的情况:NN-2N-4...420 相遇追上了。
  2. N N N 是奇数的情况:NN-2N-4...31-1。这里 -1 意味着刚好错过了,但是此时 fast 是要超出 slow 一步,再假设环的大小是 C C C。那么现在 fastslow 的距离刚好是 C − 1 C - 1 C1步。又分为两种情况:
    • 如果 C − 1 C - 1 C1 是偶数的话,那么 fastslow 就可以相遇。
    • 如果 C − 1 C - 1 C1 是奇数的话,那么 fast 就会重复上面是奇数的情况,永远不会相遇。

结论:当 fast 一次走三步,slow 一次走一步,不一定可以相遇。
在这里插入图片描述


leetcode链接:141.环形链表 I

⭕️ 代码:

bool hasCycle(struct ListNode *head) {
    struct ListNode * slow = head;
    struct ListNode * fast = head;
    
    // 考虑没有环的情况下,奇数和偶数个链表 fast 结束条件不同
    while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;

        if (fast == slow) {
            return true;
        }
    }

    return false;
}

⭐️ 环形链表 II 题目描述

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。不允许修改链表。
结论是当一个指针从 fastslow 的相遇点 meet 开始走,一个指针从 head 位置开始走,最终 meethead 会在入环点相遇。
在这里插入图片描述

🌠 为什么一个指针从相遇点走,一个指针从头走,他俩会在入环点相遇呢?

假设 head 到入环点的距离是 L L L ,入环点到相遇点的距离是 X X X,而环的大小是 C C C
首先 slow 进环之后,fast 在一圈之内,一定可以追上 slow!因为追击的过程他们距离每次缩小1,首先排除错过,而 slow 进环 fast 与其最大长度也只是 C − 1 C - 1 C1,所以 slow 最多走不到半圈,fast 就会追上。
slow 走的路程: L + X L + X L+X
fast 走的路程: L + N ∗ C + X L + N * C + X L+NC+X    ( N > = 1 ) (N>=1) (N>=1) 假设 slow 在进环前,fast 在环里转了 N N N 圈。

所以 fast 走了 slow 2倍。

  • 2 ∗ ( L + X ) = L + N ∗ C + X 2 * (L + X) = L + N * C + X 2(L+X)=L+NC+X
  • L + X = N ∗ C L + X = N * C L+X=NC
  • L = N ∗ C − X L = N * C - X L=NCX

所以 L L L 的距离就是绕了 N N N 圈之后到达 meet 的距离在减去 X X X 的距离,就是入环点。
结论:一个指针从 meet 开始走,一个指针从 head 开始走,他们会在入环点相遇。
在这里插入图片描述


leetcode链接:142.环形链表 II

⭕️ 代码:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode * slow = head;
    struct ListNode * fast = head;
    
    // 考虑没有环的情况下,奇数和偶数个链表 fast 结束条件不同
    while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;

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

             return meet;
        }
    }

    return NULL;
}

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

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

相关文章

Vue项目在IE浏览器页面白屏且报错SCRIPT1010:缺少标识符

背景 :Vue2 项目在谷歌浏览器运行好好的,在 IE 浏览器打开就会出现各种的问题。。 控制台报错 :SCRIPT1010: 缺少标识符 文件:app.403ea2d4.js,行:1,列:180 问题 : 同伴 …

Linux 中查找 IP 地址的方法

概要 在 Linux 系统中,经常需要查找 IP 地址以进行网络配置、故障排除或安全管理。无论是查找本地主机的 IP 地址还是查找其他设备的 IP 地址,本文将介绍三种简单的方法,帮助你在 Linux 中轻松找到所需的 IP 地址。 方法一:使用 i…

Greenplum数据库优化器——Join类型

join 类型语法支持 from语句允许JOIN表达式和表名列表,将joined_table从table_ref中分离出来,It may seem silly to separate joined_table from table_ref, but there is method in SQL’s madness: if you don’t do it this way you get reduce-redu…

【网络结构】——TinyViT 一种transformer的蒸馏方案

来自 Microsoft 摘要 TinyViT是一种新型的小型transformer,它们高效且可以在大规模数据集上进行预训练。TinyViT通过在预训练期间应用蒸馏来传输知识,将大型预训练模型的知识转移到小型模型中,同时使小型模型能够获得大量预训练数据的红利。…

hcip实验--RIP

实验实验要求 : 要求:R1-R2-R3-R4-R5 RIP 100运行版本2 R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络,各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R4使用R2访问R1环回 4.减少路由条目数量&am…

AttributeError: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

yolo训练时,yolo的训练项目报错,如下 w, h self.font.getsize(text) # text width, height AttributeError: ‘FreeTypeFont’ object has no attribute ‘getsize’ 说是字体没有getsize属性,实际看了一下,此属性存在&#xff0…

simulink 使能子模块 对应if else

Enabled Subsystem 使能子模块 这个值是对内部的全部变量↓ 对输出↓

web 页面布局:(一)align与表格布局

web 页面布局:(一)align与表格布局 古早时代页面布局 表格布局合并单元格表格布局的弃用 古早时代 之前,我们花费了一点时间,去了解了一下 html 的本质,那么,现在,我们就要尝试开始…

多元回归预测 | Matlab基于灰狼算法优化深度置信网络(GWO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于灰狼算法优化深度置信网络(GWO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型,matlab代码回归预测,多变量输入模型,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质…

[Android JNI] --- JNI基础

1 JNI概念 什么是JNI JNI 全称 Java Native Interface,Java 本地化接口,可以通过 JNI 调用系统提供的 API。操作系统,无论是 Linux,Windows 还是 Mac OS,或者一些汇编语言写的底层硬件驱动都是 C/C 写的。Java和C/C不…

一款批量漏洞挖掘工具

介绍 QingScan一个批量漏洞挖掘工具,黏合各种好用的扫描器。 是一款聚合扫描器,本身不生产安全扫描功能,但会作为一个安全扫描工具的搬运工;当添加一个目标后,QingScan会自动调用各种扫描器对目标进行扫描&#xff0c…

一文读懂智能汽车滑板底盘

摘要: 所谓滑板式底盘,即将电池、电动传动系统、悬架、刹车等部件提前整合在底盘上,实现车身和底盘的分离,设计解耦。基于这类平台,车企可以大幅降低前期研发和测试成本,同时快速响应市场需求打造不同的车型。尤其是无…

系统架构设计师-软件工程(2)

一、需求工程 1、需求工程阶段划分 软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望。 【需求工程主要活动的阶段划分】 2、需求获取 3、需求分析 (1)数据流图(DFD) 简称DFD,它从…

LabVIEW开发矿用泵液压头测试系

LabVIEW开发矿用泵液压头测试系 在矿井中,矿用泵是用于排放矿井水的关键设备。如果不正常运行,矿山的生产必然受到严重影响,工人的生命也受到严重威胁。确保矿用泵能够正常运行非常重要。由于其运行条件非常恶劣,矿用泵的故障率高…

网络故障排除之Traceroute命令详解

概要 遇到网络故障的时候,你一般会最先使用哪条命令进行排障? 除了Ping,还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的,是Traceroute排障命令详解,给你分享3个经典排障案例哈。 一. Traceroute…

ChatGPT 最佳实践指南之:写出清晰的指示

Write clear instructions 写出清晰的指示 GPTs can’t read your mind. If outputs are too long, ask for brief replies. If outputs are too simple, ask for expert-level writing. If you dislike the format, demonstrate the format you’d like to see. The less GPTs…

如何使网站快速拥有登录注册功能

如何使网站快速拥有登录注册功能 一、产品介绍二、开始使用1、如何判断用户是否登录?2、如何让用户登录?举个例子: 3、登录成功后如何拿到用户数据?4、如何维护用户的登录态? 二、注意点 前端必备工具(免费图床、API、chatAI等)推荐网站LuckyCola: h…

机器学习——支持向量机(数学基础推导篇【未完】)

在一个周日下午,夏天的雨稀里哗啦地下着 我躺在床上,捧着ipad看支持向量机 睡了好几个觉…支持向量机太好睡了 拉格朗日乘数法太好睡了 几何函数太好睡了 在我看来,支持向量机是目前学下来,最难以理解的内容 希望日后不要太难…脑…

[计算机入门] Windows对话框

2.4 对话框 在图形用户界面中,对话框是一种特殊的窗口, 用来在用户界面中向用户显示信息,或者在需要的时候获得用户的输入响应。之所以称之为对话框是因为它们使计算机和用户之间构成了一个对话——或者是通知用户一些信息,或者是请求用户的…

C. Russian Roulette(构造)

传送门 题意 俄罗斯转盘,长度为n的环,有k个子弹,然后挨着对着脑袋打。 你是第一个人,你希望你死的概率最小,问你怎么去设置这个子弹的位置。 第二个人会一开始随机砖圈,使得每一个位置开始都是可能的。…