【链表】Leetcode 142. 环形链表 II【中等】

环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

示例1:
在这里插入图片描述
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

解题思路

  • 1、使用快慢指针确定链表是否有环。

  • 2、如果链表有环,则通过数学推导找到环的起点。
    关键理解点梳理

  • (1)快指针比慢指针多走了环的整数倍的距离,这是由于快慢指针的移动速度差异所导致的

  • 在快慢指针相遇之前,快指针每次移动的步数都是慢指针的两倍。

  • 当快慢指针进入环中后,它们在环内以不同的速度移动。

  • 快指针每次移动两步,慢指针每次移动一步,那么在环内,快指针比慢指针每次多走一步。

  • 如果它们能在环中相遇,快指针一定比慢指针多走了环的整数倍的距离。
    f=快指针走的路程 s=慢指针走的路程 b环的路程 a入口到环的距离
    f = 2s f=s+nb 得s = nb

  • (2)如果让指针从链表头部一直向前走并统计步数k ,而k=走到链表入口节点时的步数 则k=a+nb

  • 而目前 slow 指针走了 nb 步。因此,我们只要想办法让 slow 再走 a 步停下来,就可以到环的入口

  • 刚好a是入口到环的距离,慢指针可以和head一起慢走,他们相遇时,

  • 一定是都走了a,入口也就找到了

a、b 环示例图:
在这里插入图片描述

Java实现

public class LinkedListCycleII {static class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}}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) {// 有环,重新从头和相遇点开始找环的起始点//head节点到环入口长度为a fast = head;while (slow != fast) {slow = slow.next;fast = fast.next;}return slow; // 返回环的起始点}}// 链表中没有环return null;}public static void main(String[] args) {LinkedListCycleII solution = new LinkedListCycleII();// 示例:创建有环链表ListNode head = new ListNode(3);ListNode node1 = new ListNode(2);ListNode node2 = new ListNode(0);ListNode node3 = new ListNode(-4);head.next = node1;node1.next = node2;node2.next = node3;node3.next = node1; // 形成环ListNode result = solution.detectCycle(head);if (result != null) {System.out.println("环的起始节点值为:" + result.val);} else {System.out.println("链表中无环。");}}
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(1),只需要使用常数级别的额外空间

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STC89C52单片机启动--综合案例秒表

代码功能: 1.自动开始计数,一共5个数码管来显示时间。一位数码管显示0-9,对应分度值是0.1s;两位数码管显示00-59,对应分度值1s;两位数码管显示00-59,对应分度值1min;上电后自动开始计…

学习刷题-12

3.22 hw机试【双指针】 Leetcode674 最长连续递增序列 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 双指针 一个慢指针一个快指针 慢指针记录递增子序列起点,快指针去寻找还在当前递增子序列的最后一…

忘记密码找回流程请求拦截器-前端

目录 设置找回密码请求拦截器 1.相关参数 2.约定 代码实现 1. 实现思路 2. 实现代码 校园统一身份认证系统: 基于网络安全,找回密码、重新设置密码的流程和正常登录流程中密钥等请求头不一致。 设置找回密码请求拦截器 1.相关参数 clientId 应…

【Android开发】【创建Activity,Activity之间的切换/消息传递】【java】

一、第一个Activity 1.1 创建一个空Activity 1.2 创建一个布局 知识点 在XML中引用一个id:id/id_name 在XML中定义一个id:id/id_name 右键错误,点击Show Quick-Fixes,再点击弹出的Suppress:Add........,错误会被自动修…

【C语言】动态内存分配

1、为什么要有动态内存分配 不管是C还是C中都会大量的使用,使用C/C实现数据结构的时候,也会使用动态内存管理。 我们已经掌握的内存开辟方式有: int val 20; //在栈空间上开辟四个字节 char arr[10] { 0 }; //在栈空间…

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法,而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL,它用八个二进制位(一个char的大小)表示了127个字符,任何二进制序列都可以用这127个字符表…

【小沐学AI】智谱AI大模型的一点点学习(Python)

文章目录 1、简介1.1 大模型排行榜 2、智谱AI2.1 GLM2.1.1 模型简介2.1.2 开源代码2.1.2.1 GLM-130B 2.2 ChatGLM2.2.1 模型简介2.2.2 开源代码2.2.2.1 ChatGLM-6B2.2.2.2 ChatGLM3 2.3 CodeGeeX2.3.1 模型简介2.3.2 开源代码 2.4 CogView2.4.1 模型简介2.4.2 开源代码 2.5 Cog…

关于序列化和反序列化

什么是序列化,什么是反序列化 简单来说: 序列化:将数据结构或对象转换成二进制字节流的过程反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程 为什么要进行序列化 我们要将java对象进行网络传输&a…

Grok-1安装

安装 源代码 huggingface git clone https://github.com/xai-org/grok-1.git # 新建虚拟环境 conda create --prefixD:\CondaEnvs\grok1 python3.11conda activate D:\CondaEnvs\grok1 pip install huggingface_hub[hf_transfer] pip install -U "huggingface_hub[cli]&…

#Linux(Source Insight安装及工程建立)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)安装教程: Source insight 工具安装及使用方法-CSDN博客https://blog.csdn.net/YAOHAIPI/article/details/125191451&#xff…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质,是监听 url 地址或 hash 值的改变,来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 (1)hash 定义 hash 模式是一种把前端路由的路…

SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习 GateWay简介 Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0SpringBoot2.0WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型…