【力扣】203、环形链表 II

news/2024/9/23 7:18:49/

142. 环形链表 II

要解决这道题,首先需要对问题进行拆解:

  1. 确定链表是否存在环
  2. 确定环的入口点

如何判断是否存在环呢?这个比较容易想到,使用快慢指针即可判断链表是否存在环。我们定义两个指针:

ListNode slow = head;
ListNode fast = head;

让 fast 指针的移动速度是 slow 指针的两倍即可,当它们再次相遇时,说明 fast 指针比 slow 指针多走了一圈,并重新追上 slow 指针了,此时可以说明链表存在环。

while(fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;// 如果慢指针追上快指针,说明存在环if(slow == fast) {...}
}
return null;

如何确定环的入口点呢?这涉及到数学推导,这一步不太容易想到:

让我们假设三个变量 x,y,z

可以得到公式如下:

slow指针走过的距离 * 2 = fast指针走过的距离
于是得到等式如下:
2(x + y) = (x + y) + n(y + z)		// n(y+z)表示fast指针绕环的长度
x + y = n(y + z)
x = nz + (n - 1)y
x = (n - 1)(z + y) + z

因此我们可以知道,在 slow 指针和 fast 指针相遇的节点处,满足该等式:x = (n - 1)(z + y) + z

这个式子表示什么呢?表示一个指针从头节点处出发,到环型入口处经过的距离 x 等于另一个指针从 slow 和 fast 相交的节点处出发,经过 z + (n - 1)(z + y),即走过 z 距离并绕环 n-1 圈,至于这个 n 是多少我们不必知道,于是可以得到以下代码:

// 通过数学规律发现,相交的节点到环的入口处的节点数等于头节点到环入口处的节点数
ListNode temp = head;
// 如果存在环,必定不会死循环
while(temp != slow) {temp = temp.next;slow = slow.next;
}
return slow;

至此,题解,完整 Java 代码如下:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while(fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;// 如果慢指针追上快指针,说明存在环if(slow == fast) {// 通过数学规律发现,相交的节点到环的入口处的节点数等于头节点到环入口处的节点数ListNode temp = head;// 如果存在环,必定不会死循环while(temp != slow) {temp = temp.next;slow = slow.next;}return slow;}}return null;}
}


http://www.ppmy.cn/news/1449994.html

相关文章

随便聊一下 显控科技 控制屏 通过 RS485 接口 上位机 通讯 说明

系统搭建: 1、自己研发的一个小系统(采集信号,将采集的信号数字化)通过COM口,连接显控屏 COM3 口采用 485 协议送到显控屏(显控科技)的显示屏展示出来)。 2、显控屏 将 展示的数据…

深度学习之基于YOLOv5智慧交通拥挤预警检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加速和人口规模的不断增长,交通拥挤问题日益严重。传统的交通拥挤预警方…

Servlet详解(从xml到注解)

文章目录 概述介绍作用 快速入门Servelt的执行原理执行流程:执行原理 生命周期概述API 服务器启动,立刻加载Servlet对象(理解)实现Servlet方式(三种)实现Servlet接口实现GenericServlet抽象类,只重写service方法实现HttpServlet实现类实现Htt…

精准测试-Vue前端调用链影响变更分析之一

Vue前端调用链影响变更分析之一 一、背景二、工具调研1、 工具介绍:2、工具使用 三、工具落地集成方案(待后续补充)变更影响较为简单的实现变更影响较为复杂的实现1、全局关系数据库的构建2、变更影响的简单实现3、变更影响的复杂实现 一、背…

LuaJIT源码分析(三)字符串

LuaJIT源码分析(三)字符串 要表示一个字符串,核心就是需要知道字符串的长度,以及存放字符串具体数据的地址。lua的字符串是内化不可变的,也就是lua字符串变量存放的不是字符串的拷贝,而是字符串的引用。那么…

区块链 | IPFS:Merkle DAG(进阶版)

🦊原文:Merkle DAGs: Structuring Data for the Distributed Web 🦊写在前面:本文属于搬运博客,自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时,必须通过提供节点和边的具体表示来编码我们的数据…

Postman的安装与汉化(超级详细!!!)

1、下载安装包 链接:百度网盘 请输入提取码 提取码:ywmk --来自百度网盘超级会员V5的分享 下载后的目录如图所示 2、Postman安装 双击目录下的 Postman-win64-9.10.0-Setup.exe 即可自动安装 3、Postman汉化 找到postman的安装目录,然后…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理,关联PWM实现 文章目录 细说SVPWM原理及软件实现原理,关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…