当前位置: 首页 > news >正文

LeetCode 142题解|环形链表II的快慢指针法(含数学证明)

题目如下:

在这里插入图片描述

解题过程如下:

思路:快慢指针在环里一定会相遇,相遇结点到入环起始结点的距离 == 链表头结点到入环起始结点的距离(距离看从左往右的方向,也就是单链表的方向),从链表头结点和相遇结点遍历,只要结点一样,那么这个结点就是入环起始结点。

示例1、示例2为例,

示例1:相遇结点到入环起始结点的距离1 == 链表头结点到入环起始结点的距离1

示例2:相遇结点到入环起始结点的距离0 == 链表头结点到入环起始结点的距离0
在这里插入图片描述

完整代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {//快慢指针ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;//快慢指针相遇if (slow == fast){//链表头结点和相遇结点开始往后遍历,结点一样,这个结点就是入环起始结点ListNode* pcur = head;while (slow != pcur){slow = slow->next;pcur = pcur->next;}return slow;}}//fast == NULL 或 fast->next == NULL,跳出循环,说明没有环return NULL;
}

试着证明:

为什么在带环链表中,链表的头结点和快慢指针相遇结点到入环起始结点的距离相等?

在这里插入图片描述
假设:链表的头结点到入环起始结点的距离是L,环的周长是R,若slow刚刚入环时fast已经在环里绕了n圈了(n至少为1,因为fast先进环中到M点,后又和slow在M点相遇),入环起始结点到相遇结点之间的距离是X。

慢指针进环后,快指针肯定会在慢指针走一圈之内追上慢指针。因为在快慢指针都进环之后,快慢指针之间的距离最多就是一个环的周长,快指针每追击1次,二者之间的距离就会缩小1步,所以,在慢指针移动一圈之前,快指针一定会追上慢指针。

若已经相遇,快慢指针走过的路程:
慢指针 = L + X
快指针 = L + X + nR

由于快慢指针走过的路程之间的关系2 * 慢指针 = 快指针,得出L = nR - X = (n - 1)R + R - X,式子L = (n - 1)R + R - X(n为1,2,3,4,……,n的大小取决于环的大小,环越大n越小)中,(n - 1)R表示绕(n - 1)圈,取极端情况,n = 1时,式子最终可以看成L = R - X,即slow指针从链表起始位置开始向后遍历,fast指针在相遇点开始环绕,最终一定会在入环起始结点相遇;也就是说,在带环链表中,链表的头结点和快慢指针相遇结点到入环起始结点的距离相等。

http://www.lryc.cn/news/533352.html

相关文章:

  • [图文]课程讲解片段-Fowler分析模式的剖析和实现01
  • Dify使用
  • 解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析
  • 7.PPT:“中国梦”学习实践活动【20】
  • Linux系统-centos防火墙firewalld详解
  • 零基础都可以本地部署Deepseek R1
  • 通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细)
  • css实现长尾箭头(夹角小于45度的)
  • 封装descriptions组件,描述,灵活
  • OC-Block
  • 关于知识蒸馏的概念原理以及常见方法
  • C++轻量级桌面GUI库FLTK
  • C++20导出模块及使用
  • PID 算法简介(C语言)
  • Java中的继承及相关概念
  • 语言月赛 202308【小粉兔做麻辣兔头】题解(AC)
  • 云原生后端|实践?
  • GrassWebProxy
  • 6.Python函数:函数定义、函数的类型、函数参数、函数返回值、函数嵌套、局部变量、全局变量、递归函数、匿名函数
  • 青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
  • CosyVoice /F5-TTS /GPT-SoVITS /Fish-Speech 开源语音克隆与文本转语音(TTS)项目的对比整理
  • MySQL基于binlog和gtid主从搭建方案
  • 5 计算机网络
  • Vim跳转文件及文件行结束符EOL
  • 智能理解 PPT 内容,快速生成讲解视频
  • 【鸿蒙开发】第二十四章 AI - Core Speech Kit(基础语音服务)
  • Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用
  • 番外02:前端八股文面试题-CSS篇
  • Redis Copilot:基于Redis为AI打造的副驾工具
  • JavaScript遍历对象的7种方式