leetcode第141题:环形链表(C语言+引申问题全解)

news2024/11/16 18:02:08

9d4f85660ad644b188d799bd990e6690.png

cc866abb05dd4ca798107897bb7a33b2.png

 

解题思路:

定义一对快慢指针,slow指针每次走一步,fast指针每次走两步。当快指针入环时,慢指针只走了一半。

7ef02e812d6740e4b458f13bae80c7e3.jpg

当slow指针入环时,fast指针已经在环内走了许多步。让他们两个继续走,直到相遇,可以证明链表是带环的。这是因为不带环的链表快慢指针不可能会相遇。

ce86477a6015442e8691840d2a8177b6.jpg 8296a1ae195e466ea193aeca238d3bc6.jpg

 

 

代码:

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

29affcbed24541cfbafb1f99281295e2.png

代码到这里就已经解答完成了,是不是非常简单呢?

那么,我们就思考点更有意思的问题吧!

  1. 为什么快慢指针一定会相遇?没有可能错过,永远追不上?
  2. slow走一步,fast走3步、4步、5步或n步,结果也还是一样的吗?

哦莫,直击心灵的问题。

 

对问题1的思考与解答:

敲敲,数学课上课啦!

在快指针每次走两步,慢指针每次走一步的情况下,不可能会错过,一定能够追上。

150285b9f6f449329d9406444d19a4c1.jpg

假设slow指针进环时,fast指针与slow指针相差的距离为N。那么每次快慢指针移动过后,相差距离就减少1。这是因为慢指针每次走1步,快指针每次走2步,2 - 1 = 1。

移动次数相差距离
0N
1N-1
2N-2
3N-3
4N-4
…………
X-22
X-11
X0

当相差距离为0时,代表两指针相遇了。所以一定能追上。

 

 

对问题2的思考与解答:

通过问题1的解答,我们不难发现:快指针每次走的步数 - 慢指针每次走的步数 = N每次的减少量

所以假设快指针现在每次走3步,慢指针不变,那么N每次减少2。这时候,就出现了一个问题。

f4306ab9265442e9869aebf1afa812c7.jpg

N为偶数时,每次减少2,最后能得到N=0的结果。然而,当N为奇数时,最后N= -1。

此处的 -1 意为fast指针已经越过了slow指针(如下图所示),假设整个环的大小为C,那么N 就变为了 C-1

此时,就可以把C-1看成是N。如果C-1为偶数,那么最后就能得到N=0的结果;但如果C-1为奇数,那么结果还是-1,又变成了C-1,而C-1永远是奇数,因此一定无法相遇。

48fb08205546432e9eca737a34c57eb9.jpg

总结(“fast每次走2步,slow每次走1步”的情况):

  • 如果N为偶数,那么第一轮slow和fast就能相遇
  • 如果N为奇数,第二轮一开始fast和slow相差C-1
  1. 若C-1是偶数,那么第二轮就追上了
  2. 若C-1是奇数,那么就永远也追不上

所以,同时存在C是偶数且N是奇数,那么就永远也追不上。

 

数学论证:

 

e90aa3066d9f424995635817f2d6be62.jpg

假设进环以前,slow与fast都需要走L的路程。那么当slow进环时,fast已经走了 L + x*C + C - N(x为fast在环里面转了几圈)

因为slow进环时,fast走的距离是slow3倍,所以slow走了L,fast走了3L。

综上所述,得到公式:3L = L + x*C +C - N

即2L = (x+1)*C - N。2L一定是偶数,要论证的是C是偶数且N是奇数时,永远追不上(可以使用反证法)。把这种情况代入公式,C为偶数,那么(x+1)*C一定是偶数;N为奇数,因此右式一定为奇数( 偶数-奇数 一定是奇数),相互矛盾。所以C是偶数且N是奇数时,永远追不上。证毕。

除了这种情况外,其他情况下fast都是能追上slow的。

 

更多情况:

73e6ecf234124b85b23563388add1319.jpg

假设fast每次走4步,slow每次走1步,那么情况就与上文所讲解的形同。继续通过判断是奇数还是偶数,以及列出判断公式就能解决问题。只是情况要分为了两指针错过后,相距C-2还有相距C-1两种情况(N和3取模即可有不同结果)。请大家也来试着做做吧!

 

 

 

 

 

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

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

相关文章

矩阵中的最大得分(Lc3148)——动态规划

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。 你可以从 任一 单元格开始,并且必须…

STM32G0系列配置Freertos所管理的最高中断优先级

最近在G070上部署Freertos,用cubemx生成的时候发现无法选择freertos所能管理的最高优先级和最低优先级,即configMAX_SYSCALL_INTERRUPT_PRIORITY和LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。我们可以发现在F103RCT6上是可以选择这两个优先级限制的&#…

树莓派开发笔记01-树莓派的系统烧录以及初次开机配置

github主页:https://github.com/snqx-lqh gitee主页:https://gitee.com/snqx-lqh 本项目github地址:https://github.com/snqx-lqh/RaspberryPiLearningNotes 本项目gitee地址:https://gitee.com/snqx-lqh/RaspberryPiLearningNote…

详解golang内存管理

介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。因为 Go 语言的内部机制是建立在这个基础之上的,它的设计,本质上就是尽可能的会发挥操作系统层面的优势,而避开导致低效情况。 操作系统内存管理 其实现在计算机内存管理的方式都是…

Python---容器

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.容器概念 在Python中,容器是指可以存放多个元素的对象。常见的容器类型有列表(List)、元组(Tuple)、集合(Set&#xf…

solidwork经验总结2

新建<装配体 打开之后可以直接从文件夹将零件中拖入&#xff0c;也可以 怎样装配在一起&#xff1f; 点击配合。 假如我要把轴承装到这个孔里面来 首先&#xff0c;它们一定得是共线 然后点击这两个圆 产生同轴心 选择重合&#xff0c;可以两个贴紧 上面这个也可以按照需求…

ECEF地心地固坐标系与ENU站心坐标系互转

ENU站心坐标系 站心坐标系也叫做站点坐标系、东-北-天坐标系ENU&#xff0c;英文名称是local Cartesian coordinates coordinate system&#xff0c;主要是用于需了解以观察者为中心的其他物体运动规律。 站心直角坐标系 定义&#xff1a;以站心&#xff08;如GPS接收天线中…

植物生长时为什么会扭动?科学家解开令查尔斯·达尔文困惑的千古之谜

在一项新的研究中&#xff0c;来自美国和以色列的物理学家可能已经弄清了植物生长过程中的一种古怪行为–也是查尔斯-达尔文本人在其生命的最后几十年里所好奇的一个谜&#xff1a;对于许多人类来说&#xff0c;植物可能看起来静止不动&#xff0c;甚至有点无趣。但实际上&…

小米5c解除BL锁刷机root

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 解锁BL锁 1. 下载安装 miflash_unlock&#xff1a;https://miuiver.com/miunlock/&#xff0c;登录小米账号&#xff08;需要和解锁设备绑定的账号一致&#…

Java Web —— 第六天(Mybatis)

lombok Lombok是一个实用的Java类库&#xff0c;能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法&#xff0c;并可以自动化生成日志变量&#xff0c;简化java开发、提高效率 在pom.xml文件中引入依赖 <!--lombok--><dependency>…

Spring IoCDI(中)--IoC的进步

通过上文的讲解和学习, 我们已经知道了Spring IoC 和DI的基本操作, 接下来我们来系统的学习Spring IoC和DI 的操作. 前⾯我们提到IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对 象&#xff0c;也就是bean的存储。 1. Bean的…

Datawhale AI 夏令营第四期 大模型技术-微调 task3 数据增强与评分

前面我们介绍了baseline的思路及写作方案&#xff0c;这里我们尝试对数据做增强&#xff0c;但是需要聪明的你加入自己的努力完成更好的思路。 今天需要大家学习上手尝试数据增强&#xff0c;不过我会把增强的思路和相关知识告诉大家&#xff0c;让大家学习如何使用llm完成数据…

Ugandan Knuckles

目录 一、题目 二、思路 三、payload 四、思考与总结 一、题目 <!-- Challenge --> <div id"uganda"></div> <script>let wey (new URL(location).searchParams.get(wey) || "do you know da wey?");wey wey.replace(/[<…

铁电存储器(FM24W256)I2C读写驱动(4):I2C读写测试

0 参考资料 FM24W256&#xff08;Cypress公司生产&#xff09;数据手册 1 I2C读写测试 1.1 简单测试方法 使用前面我们设计好的读写驱动&#xff0c;向FM24W256起始地址为0xF0存储区域写入16字节数据“ABCDEFGHIJK12345”&#xff0c;断电后再读取出来&#xff0c;查看读写是…

MySQL基础练习题48-连续出现的数字

目录 题目 准备数据 分析数据 题目 找出所有至少连续出现三次的数字。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Logs (id int, num int)## 向表中插入数据 Truncate table Logs insert into Logs (id, num) values (1, 1) i…

Autodesk Maya 2019 for Mac/Win:专业三维动画制作软件的巅峰之作

Autodesk Maya 2019是一款世界顶级的三维动画制作软件&#xff0c;专为Mac和Windows系统打造&#xff0c;广泛应用于影视广告、角色动画、电影特技等专业领域。其强大的功能和灵活的工具集&#xff0c;使得用户能够高效地完成复杂的三维建模、动画设计、特效制作及高质量渲染等…

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当接入请求过多时&#…

VirtualBox上的Oracle Linux虚拟机安装Docker全流程

1.安装docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装docker仓库 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 生成docker的yum源配置到在 /etc/yum.repos.d/docker-ce.repo 3.安装D…

【软件测试】单元测试20套练习题

&#xff08;一&#xff09;概述 使用Java语言编写应用程序&#xff0c;设计测试数据&#xff0c;完成指定要求的白盒测试&#xff0c;对测试数据及相应测试结果进行界面截图&#xff0c;将代码以及相关截图粘贴到白盒测试报告中。 &#xff08;二&#xff09;题目要求

Keepalived秘籍保障系统高可用的终极武器

目录 一 高可用集群 1.1 集群类型 1.2 实现高可用 1.3 vrrp&#xff08;Virtual Router Redundancy Protocol&#xff09; 二 keepalived 部署 2.1 简介 2.2 keepalived 架构 2.3 keepalived 搭建 三 keepalived 应用示例 3.1 实现master/slave的keepalived单主架构 …