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

news2024/9/28 13:21:55

环形链表 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.coloradmin.cn/o/1541535.html

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

相关文章

YoloV8改进策略:BackBone改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文,使用PKINet替代YoloV8的主干网络,实现涨点。PKINet是我在作者的模型基础上,重新修改了底层的模块,方便大家轻松移植到YoloV8上。 论文:《Poly Kernel Ince…

zabbix企业微信的告警媒介配置

简介: Zabbix企业微信告警媒介可用于向特定群组成员发送提醒通知。 前提条件: 完成Zabbix告警平台的搭建后,需将群机器人添加至告警提醒群中。 企业微信群聊——右上角三个点——添加群机器人 保存好产生的webhook地址(注意&…

Kotlin的lateinit关键词

Kotlin的lateinit关键词 lateinit,延迟初始化。有时,并不能定义一个变量或对象值为空,而也没办法在对象或变量在定义声明时就为它赋值初始化,那么这时就需要用到Kotlin提供的延迟初始化lateinit。比如,有些依赖注入框架…

Docker可视化管理工具DockerUI

什么是 DockerUI ? DockerUI 是一款开源的、强大的、轻量级的 Docker 管理工具。DockerUI 覆盖了 docker cli 命令行 95% 以上的命令功能,通过可视化的 Web 界面操作,可以非常方便、轻松进行 docker 环境和 docker swarm 集群环境的管理和维护…

二分算法(查找)

问题:在数组中查找某一个数字x4的下标 例:arr:1 3 4 6 10 20 21 22 显然,数字4的下标为3。 1、线性查找,一个个地去遍历,时间复杂度为O(n) 2、二分查找&#xff0…

Centos7虚拟机中oracle19c数据库安装

目录[-] 1. Centos7虚拟机中oracle19c数据库安装 1.1. 1.先诀条件1.2. 2.oracle19c安装准备(root用户下执行)1.3. 3.CentOS7上安装oracle19c 1.先诀条件 本文在安装oracle19c时,各项oracle配置操作都通过图形界面进行。因此CentOS7系统需要安装gnome图形程序,虚拟机安装时未…

【自编码器】梳理(上)

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 梳理有关自编码器 1. 自编码器 1.1 原理 Auto-Encoder,中文称作自编码器,是一种无监督式学习模型。利用输入数据 X X X本身作…

苍穹外卖笔记

苍穹外卖 DAY01nginx反向代理MD5加密yapi进行接口导入Swagger介绍 DAY02新增员工需求分析和设计写相关代码测试(1. 后端文档测试 2. 前后端联调代码完善 员工分页查询DAY01 02涉及到的知识 DAY01 nginx反向代理 MD5加密 拓展:spring security jwt 提供了更强大灵…

实战高效RPC方案在嵌入式环境中的应用与揭秘

实战高效RPC方案在嵌入式环境中的应用与揭秘 开篇 在嵌入式系统开发中,大型项目往往采用微服务架构来构建,其核心思想是将一个庞大的单体应用分割成一系列小型、独立、松耦合的服务模块,这些模块可以是以线程或进程形式存在的多个服务单元。…

C语言动态内存的管理

前言 本篇博客就来探讨一下动态内存,说到内存,我们以前开辟空间大小都是固定的,不能调整这个空间大小,于是就有动态内存,可以让我们自己选择开辟多少空间,更加方便,让我们一起来看看动态内存的有…

yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理

简介 RK3588是瑞芯微(Rockchip)公司推出的一款高性能、低功耗的集成电路芯片。它采用了先进的28纳米工艺技术,并配备了八核心的ARM Cortex-A76和Cortex-A55处理器,以及ARM Mali-G76 GPU。该芯片支持多种接口和功能,适…

python写爬虫爬取京东商品信息

工具库 爬虫有两种方案: 第一种方式是使用request模拟请求,并使用bs4解析respond得到数据。第二种是使用selenium和无头浏览器,selenium自动化操作无头浏览器,由无头浏览器实现请求,对得到的数据进行解析。 第一种方…

分布式技术知识体系

分布式架构知识与技术 1.分布式相关理论与组件原理 理解分布式基础理论(CAP/BASE) 掌握分布式必知必会的核心知识与技能 摸清分布式系统研发与设计的各个环节 2.分布式相关技术及实践 掌握分布式各应用场景与实践技术栈 熟练运用分布式中间件 完成软件…

java面向对象编程基础

对象: java程序中的对象: 本质上是一种特殊的数据结构 对象是由类new出来的,有了类就可以创建对象 对象在计算机的执行原理: student s1new student();每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象s1变…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-最短路

6 肉眼观察&#xff0c; 看起来短的几条路对比下来是6~ #include <iostream> using namespace std; int main() {printf("6");return 0; }

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01;

蓝桥杯需要掌握的几个案例(C/C++)

文章目录 蓝桥杯C/C组的重点主要包括以下几个方面&#xff1a;以下是一些在蓝桥杯C/C组比赛中可能会涉及到的重要案例类型&#xff1a;1. **排序算法案例**&#xff1a;2. **查找算法案例**&#xff1a;3. **数据结构案例**&#xff1a;4. **动态规划案例**&#xff1a;5. **图…

Python文件读写操作

文件操作注意点 注意点&#xff1a; 1. for line in file --> 会将偏移量移到末尾 2. buffering1 --> 缓冲区中遇到换行就刷新&#xff0c;即向磁盘中写入 3. 读操作结束后&#xff0c;文本偏移量就会移动到读操作结束位置 """编写一个程序,循环不停的写入…

SQLServer TRY_CONVERT函数

TRY_CONVERT&#xff1a;数据库中的安全转换利器 在数据库操作中&#xff0c;数据类型转换是一个常见的需求。然而&#xff0c;传统的转换方法在面对无法转换的数据时&#xff0c;往往会抛出错误&#xff0c;影响程序的稳定性和用户体验。为了解决这个问题&#xff0c;SQL Serv…

Mysql数据库:事务管理

目录 一、Mysql事务的概述 1、Mysql事务的概念 2、事务的ACID四大特性 3、事务之间的相互影响 4、事务的四种隔离级别 5、MySQL与Oracle自动提交事务的区别 6、事务隔离级别的作用范围 二、Mysql事务相关操作 1、查询和设置事务隔离级别 1.1 全局级事务隔离级别 1.1…