快慢指针判环步长差的探讨与解析

[寻找环链表入口点] 快慢指针数学原理剖析 链表环路检测及环入口定位是一个非常经典的算法问题,它可在死锁检测等实际应用场景发挥重要作用。想必大家都知道这个问题应该使用快慢指针去求解,因为它具有最优的时间复杂度O(n)。但是大家可能对快慢指针的数学原理不是很清楚,为啥它能达到最优。详细读了这篇文章,大家必定豁然开朗,掌握快慢指针背后的数学原理。 我们直接来看图。 先讲一下链表环路检测的原理,相比环入口定位,原理比较简单。 起点设置... 阅读详情

一.解题

力扣经典链表判环问题:141. 环形链表

而解决这样的环形链表,快慢指针是经典算法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 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;
}
   

二.疑问与解析

疑问.

在这个算法中我们采取了快慢指针步长差为 1,那为什么要一定是 1 呢?为什么1 就一定能追的上呢?能不能是 2 呢?3 呢?N 呢?如果不是 1,还一定追的上吗?

解析.

让我们先来解析一下,为什么 1 就一定能追的上呢?

Slow 走 1,Fast 走 2:

  • 相对速度是 1。

  • 这就好比你在操场跑圈,前面的人比你快 1m/s。不管你们其实距离多少(N),每一秒距离缩短 1 米:N, N-1, N-2 ... 0。

  • 结论:因为距离是一步步减小的,一定 会减到 0(相遇)。

所以,目前来看 1 是最优的,不需要担心什么,而快慢指针的算法步长差普遍也为 1.

如果 Slow 走 1,Fast 走 3 呢?

  • 相对速度:3 - 1 = 2

  • 距离变化:每次缩短 2 米

  • 风险:如果初始距离 N 是奇数,距离变化会是 N  N-2...  1  -1

    • 这个 -1 意味着 Fast “跳过” 了 Slow,跑到了 Slow 前面 1 个单位的位置

    • 此时,新一轮的追击距离变成了 C-1 (C 是环的周长),那如果 C-1 也是奇数呢?也就是 C 是偶数,也就意味着永远追不上了。

好像我们得出来了一个结论,也就是当 N 为奇数,且 C为偶数的时候,就永远追不上了。

但事实真就如此吗?N 是否与 C 有某种制约关系呢?这样的情况会不会永远不会出现?

我们注意到,slow 的速度是 fast 的一半,而他们是同时出发的,根据 S = v * t,那他们所走过的路程也有关系,是否能找到N 和 C 的关系呢?

代数证明:

  1. 假设:Slow 进环时,走了L的路程。

  2. 此时:Fast 走了 3L 的路程(因为速度是 3 倍)。

  3. 几何关系:Fast 此时在环里,位置是 L + x *C + N(x 是圈数,N 是入环后的相对距离)。

  4. 建立等式:

    3L = L + x*C + N

    2L = x*C + N

  5. 奇偶性分析(高能预警):

    • 等式左边 2L:一定是偶数。

    • 等式右边 x*C + N:必须也是偶数。

    • 如果 C 是偶数(死锁条件之一),那么 x*C 也是偶数。

    • 那么 N 必须是:偶数 - 偶数 = 偶数。

结论:

  • 如果要死循环,必须满足C是偶数 且 N 是奇数。

  • 但是数学公式告诉我们:只要 C 是偶数,N 就一定是偶数!

  • 结论: “N 是奇数”和“C 是偶数”这两个条件,永远不可能同时成立。

终极结论:

即使是用 Fast 走 3 步,它们也一定会相遇! 根本不存在追不上的情况。

但在这类问题,我们还是更倾向于用步长差为 1 来解决

原因如下

  • 代码代价:

    • 走 2 步:fast->next->next,只需要判断一次非空。

    • 走 3 步:fast->next->next->next,得小心翼翼地多判断几次空指针,代码写起来恶心。

  • 收敛速度:

    • 相对速度为 1(走 2 步)是最稳的,它一定能“逐个遍历”所有可能性。

    • 相对速度越大,虽然理论上能追上,但可能会在环里多绕好几圈(因为一直在跳跃),效率不一定比走 2 步高。

TMS320F28388D 学习笔记2 高精度PWM (HRPWM) HRPWM的学习记录。 阅读详情

相关推荐

淘特App x-sign参数逆向实战:从抓包到算法定位

本文详细解析了淘特App的x-sign参数逆向过程,从抓包分析到算法定位,涵盖了使用jadx-gui进行静态分析、Frida动态Hook验证以及Native层算法还原等关键技术。文章重点介绍了x-sign参数的生成机制及其在阿里系应用中的安全防护策略,为逆向工程师提供了实用的调试技巧和对抗策略。

5b6n7m8的博客 228

上手快慢指针,看着一篇就够了

文章目录缘起什么是快慢指针本文核心问题一:为什么快指针每次移动2,慢指针每次移动1?情况一:环为奇数情况二:环为偶数问题二:如何判断环的入口结点和环大小结束语reference 这篇博客讨论一下常见的快慢指针算法 缘起 自从刷leetcode以来,已经碰见过很多次应用快慢指针算法的题目了,但是每次都是直接刷过,并没有好好思考为什么要这么做,这篇博文来探讨一下快慢指针一些常见的问题,了解这些问题可能...

williamgavin的博客 2144

从ST电机库到TI InstaSPIN:手把手对比两种主流FOC实现中的坐标变换差异

本文深入对比了ST电机库与TI InstaSPIN在FOC实现中的坐标变换差异,包括坐标系定义、变换系数和角度处理等关键点。针对BLDC和PMSM电机控制,提供了从理论到实践的移植方案,帮助工程师快速解决平台切换中的性能问题。特别解析了Clarke/Park变换在两种实现中的微妙差异及其对PI控制的影响。

weixin_28724661的博客 398

快慢指针算法

快慢指针概念 快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 快慢指针找链表环相关理论 参考链接 快指针必然与慢指针相遇 慢指针进入环后,快指针最多多绕一个圈 若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点 找到连接点p后,求head到p的长度,再加上环的长度,即为链表的总长 应用案例 ...

weixin_33691817的博客 629

OAI骨关节炎数据集申请与DICOM下载全流程避坑指南

医学影像分析中,DICOM格式是存储与交换CT、MRI等数据的通用标准,其元数据Tag承载着像素间距、层厚等关键物理信息,直接影响定量分析的准确性。在骨关节炎研究领域,OAI数据集因样本量大、随访时间长而成为高价值资源,但获取需通过NDA协议申请,并借助nda-tools命令行工具完成TB级影像的批量下载与断点续传。这一流程涉及浏览器环境配置、DICOM格式转换及Python预处理等工程环节,任一细节疏漏都可能导致数据读取异常或分析偏差。掌握从申请到落地的完整链路,能显著提升医学影像AI研究的效率与可复现性

weixin_30843121的博客 276

【WB32库开发】第9章 TIM1高级定时器——输出多路PWM

PWM(Pulse Width Modulation)意为脉冲宽度调制,简称脉宽调制 。在工控行业,PWM信号可以用来调节电机转速、调节变频器以及BLDC电机驱动等;在LED照明行业,可以通过PWM来控制LED的亮暗变化;还可以通过PWM信号来控制无源蜂鸣器发出简单的声音等。 WB32也可输出PWM,需配置WB32上的定时器。 在WB32中有4个定时器,其中TIM1为高级定时器,TIMx(2-4)为通用定时器,这四个定时器均挂载在APB1总线上,每个定时器都可以输出4路PWM。 本章需要使用固件库TIM例程

北海村夫的博客 4637

【初探数据结构】带环链表:原理、判断与数学证明

由节点构成的链式结构中存在至少一个节点,其指针域指向链表中已存在的节点,形成闭合环路。环路结构:尾节点不指向NULL而指向历史节点遍历特性:从任意环内节点出发将陷入无限循环。

Surplus886的博客 1342

从牛顿冷却定律到热传导方程:一维热传导方程的物理直觉与数学推导

本文从牛顿冷却定律出发,结合傅里叶热传导定律和能量守恒原理,系统推导了一维热传导方程的数学形式。通过微元分析和物理直觉,揭示了温度随时间变化与空间二阶导数之间的关系,并阐释了热扩散率α的物理意义。文章还探讨了方程的边界条件、数值解法及其在材料科学和工程中的应用,为理解热量传递提供了清晰的物理图像和数学框架。

palm99的专栏 837

算法训练|Day3|LeetCode 142. 环形链表 II(Floyd判圈)|能否用系数k自适应快慢指针差值|Brent方法

快指针:初始步长为step_limit=1,每次移动step_limit后,检查是否和慢指针相遇,如果没有相遇,step_limit*=2,并将慢指针移动到快指针的位置,直到快指针到达链表尾(无环)或者快慢指针相遇(有环)举一个例子,首先假设慢指针进入环的时候,快指针与慢指针的距离为D,如果环大小L为4,D为1。想象带环链表中的环是操场,其他部分是教学楼到操场的距离,如果甲乙同学同时下楼,v甲=2v乙,那么甲乙相遇说明一定有操场,很好理解。当它们相遇则说明有环。快指针移动两格,慢指针移动一个,这是为什么?

2302_76409391的博客 671

一文读懂 SAP ICF Services:从 SICF 激活到 ABAP OData V2/V4 安全与实战

本文系统化介绍了ABAP系统中ICF服务的关键概念及实践要点。主要内容包括:ICF服务的核心安全机制,需显式激活才能响应HTTP请求;在SICF中正确激活服务的操作步骤;OData V2/V4服务所需的不同ICF节点配置,如V4统一入口节点/sap/opu/odata4;典型问题如default_host未激活会导致HOST_INACTIVE错误;安全实践包括CSRF防护机制和权限对象(S_ICF_ADM)配置;以及实际案例分析和常见ICF服务节点的功能说明。文章为ABAP开发者与运维人员提供了ICF服务管

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 472

小目标检测难题终结:YOLOv11 + 注意力机制,精度直接拉满

如果你在实操中遇到精度提升不明显或速度下降过多的问题,不妨尝试调整注意力模块的类型(如替换为CA)或插入层级,或针对性优化小目标的数据集增强策略。记住,小目标检测的核心是“特征强化与空间定位”,只要结合业务场景灵活调整注意力模块的组合,你也能让YOLOv11在小目标识别任务中脱颖而出。接下来,我们从模块选型到代码落地,一步步带你打造“小目标检测专精版”YOLOv11,真正帮你解决工业场景中(如安防、质检)的小目标识别痛点。在城市安防场景中,改进后的YOLOv11对远处行人、车辆(小目标)的识别准确率提升。

m0_64661770的博客 199

【高频算法题突破】:快慢指针优化全解析,彻底掌握链表环检测核心逻辑

掌握链表环检测高效解法,深入解析C语言链表环检测的快慢指针优化。适用于单向链表循环判断,通过快慢指针相遇原理,降低时间与空间复杂度,提升算法效率。理解核心逻辑,轻松应对高频面试题,值得收藏。

QuickTrans的博客 855

如何懂固高卡以及滚筒轴+平移轴配合运动?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 847

戏谈单向链表判环

大家都遇到过这个问题,就是如何判断一个单链表是否有环?当然,判断方法很多,但是目前网上最出名的那个方法大概是这样:设甲、乙两个指针指向同一起点,之后甲乙交替着走,甲每次走两步,乙每次走一步,遇到下面的情况则说明链表有环:甲某次走完两步后遇到了乙或者乙某次走完一步后遇到了甲。那么大家想没想过,为什么甲每次走两步,乙每次走一步这样可以?如果甲每次走4步乙每次走2步可不可以?各种步长对时间复杂...

andun6063的博客 170

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

从入门到精通:快慢指针在链表环检测中的高效应用,99%的人都忽略了这个细节

掌握C语言链表环检测的快慢指针优化,高效判断链表中是否存在环。适用于单向链表、内存受限场景,通过快慢指针不同步长遍历,空间复杂度O(1),性能远超哈希表法。细节决定成败,值得收藏。

Instrustar的博客 849

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

利用快慢指针解决中间值问题,单向链表是否有环问题以及有环链表入口问题。

利用快慢指针解决中间值问题,单向链表是否有环问题以及有环链表入口问题 1. 中间值问题; 2. 单向链表是否有环问题; 3. 有环链表入口问题; 快慢指针: 快慢指针指的是定义两个指针,这两个指针的移动速度一快一慢,以此来制造出自己想要的差值,这个差值可以让我们找到链表是哪个相应的结点,已满情况下,快指针的移动步长为慢指针的两倍。 中间值问题: 当快指针走到尾部的时候,慢指针恰恰走到中间的位置; ...

qq_43751200的博客 494

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

xutils找id空指针_“快慢指针”的数学证明及讨论

说在前面的话最近正是春招季,忙着找工作的程序猿们对“快慢指针”可谓再熟悉不过了。程序人人都会写,但说到“快慢指针”背后的数学原理,又有多少人懂呢?我那儿子(兼室友)就被这个问题打了个措手不及。本文诞生于和室友的相关讨论。室友也写了篇博文——检测链表有环中的数学​github.com室友的风格比较简洁。希望听我唠唠叨叨讲故事的读者请往下看~本文内容“快慢指针”的数学证明分两步:“一定会相遇”的证明,...

weixin_31616803的博客 178

还在用哈希表检测链表环?快慢指针的3种进阶优化方案震撼来袭

掌握C语言链表环检测的快慢指针优化技巧,告别低效哈希表方案。适用于高频面试与系统开发,通过步长调整、环入口定位和提前终止三种进阶方法提升效率。实现O(1)空间与稳定性能,值得收藏。

LogicShoal的博客 792

C++单链表检测是否有环详解

1. 判断单链表是否有环。 2. 如果单链表有环,判断环长,入口点位置。 3. 判断链表长度。 这个问题网上有很多种解法,其中一种是快慢指针法。定义快慢两个指针,快指针一次移动两个节点,慢指针一次移动一个节点,从表头开始遍历链表。如果有环,快慢指针会在环中相遇,然后停止遍历。如果没有环,快慢指针会遍历到链表结尾的空节点,然后停止遍历。 ...

gdizcm的专栏 1166

链表环检测速度提升3倍?你不可不知的快慢指针高级优化技巧

掌握C语言链表环检测的快慢指针优化,高效识别链表中是否存在环路。适用于算法竞赛与系统底层开发,通过步长优化使检测速度提升3倍,降低时间复杂度。原理清晰、实现简单,显著提升程序性能。值得收藏

FuncLens的博客 903

算法 —— 找出链表环入口实现 与 原理

目录一、题目描述二、解决思路方法①方法②三、代码实现四、原理KaTeX数学公式 一、题目描述 二、解决思路 方法① 利用对象hashCode唯一,每经过一个节点就判断该节点hashCode是否在set中,若在则此节点为环入口,否则将该节点hashCode存入set中。若遍历发现存在null则说明不存在环。 因为需要一个hashset因此需O(n)的额外空间。 方法② 使用快慢指针的思路,fast指针和slow指针都从head开始遍历链表,slow每次后移一步(一次next),而fast每次后移两步(两次n

简简单单记录 683

链表带环之双指针,入口节点问题

小小的难度,满满的干货,冲鸭!

qq_52777887的博客 840

LeetCode - 链表快慢指针类总结

链表快慢指针       快慢指针中的快慢指的是指针沿链表移动的步长,即每次向前移动速度的快慢。快指针每次沿链表向前移动两步fast=fast->next->next,慢指针每次向前移动一步slow=slow->next。 一、回文链表 请判断一个链表是否为回文链表。用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题。 示例 1:输入: 1->2 ;输出: false...

much efforts, much luck 636

快慢指针问题

快慢指针可以用来检测链表是否有环,问题是为什么快指针一定会追上慢指针呢? 从数学的角度,当快指针步长为2时,慢指针走完一圈,此时快指针走完2圈,必定在第一个节点相遇 以此类推,当快指针步长为N时,慢指针走完一圈,此时快指针走完N圈,必定会在第一个节点相遇,但是初次遇见未必是在第一个节点 有意思的是从物理角度,当两个物体速度不同时,将其中慢指针看为静止,由于起始位置相同,就相当于快指针第二次到

hongqianshen的博客 760

快慢指针java

1、中间值的问题, 定义两个指针,fast slow ,最开始的时候都指向头节点。 当块指针指向为空的时候,就可以结束了。慢指针指向的节点就是中间值。 2、链表有环的问题 定义两个指针,fast slow ,最开始的时候都指向头节点。快指针的速度是慢指针速度的两倍。当出现快指针指向同一个元素(节点)的时候,就说明这个时候的链表是有环的。 3、有环量链表的入口问题。 当快慢指针相遇的时候,我们可以判断链表中是有环的,这个时候重...

chenchw的博客 438

环形链表的步长的证明问题

环形链表的问题一般用快慢指针解决; 慢指针每次走1个节点,快指针每次走n个节点,如上图所示。 若链表中有环,且环形的周长为C; 当慢指针刚进入环中时(如上图所示),快指针距离慢指针的距离设为x; 设从慢指针刚进入环中开始到快慢指针相遇的时间为T; 若两者能相遇,则必须满足以下公式: 若上式成立,必须满足 [X + (n-1)T] % C = 0 ; 下面分情况讨论: 当n = 2 时,上式变为 (X + T )% C =0, 只需取T = mC - X (m为整数)即可使等式成立,即快指针步长为2时

weixin_41108060的博客 461
上一篇: 从 0->1 的用C语言手搓基于顺序表的通讯录项目(优化版)
下一篇: 纯干货C++STL 在算法比赛中的常见应用与技巧——String 篇
DDXYcoder
博客等级 码龄1年 140粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值