链表中环的入口节点(环形链表),剑指offer,力扣

news/2025/2/22 15:14:49

目录

力扣题目地址:

题目:

我们直接看题解吧:

解题方法:

审题目+事例+提示:

解题分析:

解题思路:

主要思路:先判断是否有环,有则找出环入口节点


力扣题目地址:

142. 环形链表 II - 力扣(LeetCode)

难度:中等

今天刷链表中环的入口节点(环形链表),大家有兴趣可以点上看看题目要求,试着做一下

题目:

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表

我们直接看题解吧:

解题方法:

此类题目一般使用双指针法解决,比如寻找尾部第K个节点,寻找环入口。寻找公共尾部入口等。

方法1,哈希表,利用元素不可重复的性质

方法2,快慢指针(双指针)

难度分析:

这道题主要难在理解两个指针二次相遇的位置即为入口节点,需要数学推导进行理解

审题目+事例+提示:

不可原地修改链表

解题分析:

如果仅仅只是判断链表是否有环的话,直接快慢指针法是否相遇即可(只需要一次)

但是这道题目需要求出的是环入口节点,当然也是用双指针法较优(但是需要让两个指针相遇两次)

解题思路:

主要思路:先判断是否有环,有则找出环入口节点

1、首先判断链表是否为空,空则返回null

2、接下来创建双指针,快指针fast,慢指针slow,都初始化指向头结点head

3、第一次循环遍历:  判断是否存在环,即fast是否指向null

    fast每次移动2步,slow每次移动1步

    ·无环,fast指向null则直接返回null

    ·有环,fast与slow将会相遇即fast==slow(第一次)则跳出循环

4、 第二次循环遍历:寻找入口节点

     将fast 指针再次初始化,指向头结点head,slow不变

    在循环里面:

    fast与slow都是每次移动1步,直到它们相遇(第二次),则跳出循环

                                              (   此时它们相遇之处即为  环的入口节点)

5、最后返回fast。

代码实现:

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (true) { //第一次循环,是否存在环
            //fast当前指向或者下一位为null,意味着已经遍历到链表尾部,即无环
           if (fast == null || fast.next == null) return null;
            fast = fast.next.next;        //相当于移动两步
            slow = slow.next;
            if (fast == slow) break; //相等直接退出循环,即存在环
        }
        fast = head;          //fast指针再次初始指向头结点head
        while (slow != fast) { //第二次循环,找出环入口节点
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

代码实现(哈希):

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode pos = head;
        Set<ListNode> visited = new HashSet<ListNode>();
        while (pos != null) {
            if (visited.contains(pos)) {
                return pos;
            } else {
                visited.add(pos);
            }
            pos = pos.next;
        }
        return null;
    }
}


最后附上一句评论:

     "如果环存在,那么相遇便是注定的。从开始到相遇,从相遇到结束。"

         (果然恋爱脑不适合刷题...)


http://www.niftyadmin.cn/n/5222465.html

相关文章

MS1242/MS1243:24bit 高精度、低功耗模数转换器

产品简述 MS1242/MS1243 是一款高精度、宽动态范围、 ∆-Σ 模数转 换芯片&#xff0c;其工作电压为 2.7V 至 5.25V &#xff0c;可以达到 24bit 无失码转 换&#xff0c;有效精度可达 21bit 。 MS1242/MS1243 可以广泛使用在工 业控制、称重、液体 / 气体化学分析、血液分…

GO 集成Prometheus

一、Prometheus介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一套开源的监控&报警&时间序列数据库的组合&#xff0c;起始是由SoundCloud公司开发的。随着发展&#xff0c;越来越多公司和组织接受采用Prometheus&#xff0c;社会也十分活跃&#xff0c;他们便…

Linux图片处理命令详解

在Linux操作系统中&#xff0c;图像处理是一个常见的任务&#xff0c;而命令行工具为用户提供了强大而灵活的图像处理工具。本文将介绍一些在Linux终端中常用的图像处理命令&#xff0c;涵盖图像查看、转换、编辑等方面。 1.查看图像 display命令 display命令是ImageMagick工…

Vue路由嵌套和携带参数的几种方法

1、路由嵌套 路由嵌套逻辑&#xff1a; router.index.js中使用children嵌套子路由 //该文件专门用于创建整个文件的路由器 import VueRouter from vue-routerimport About from "/pages/About"; import Home from "/pages/Home"; import News from "…

2024年最受欢迎的项目管理工具盘点

十大项目管理系统包括&#xff1a;1.产品研发项目管理工具&#xff1a;PingCode&#xff1b;2.通用项目协作工具&#xff1a;Worktile&#xff1b;3.开源项目管理系统&#xff1a;Redmine&#xff1b;4.IT/敏捷项目管理系统&#xff1a;Jira&#xff1b;5.免费个人项目管理&…

放弃很容易,但坚持一定很酷——中国人民大学与加拿大女王大学金融硕士

在这个快节奏的时代&#xff0c;我们总是被各种各样的诱惑和困难所困扰&#xff0c;有时候&#xff0c;放弃似乎是一种更容易的选择。然而&#xff0c;只有那些坚持不懈的人&#xff0c;才能真正体验到成功的喜悦。真正能够让我们成长和进步的&#xff0c;往往是那些需要坚持和…

西南科技大学C++程序设计实验二(类与对象一)

C++最大的特点就是面向对象,掌握它的几种基本性质还是好理解的,可以看我C++专栏的期末速成,希望对你们学习C++有帮助。 一、实验目的 1.理解简单类的定义、说明与使用 2.理解类中不同属性数据成员的访问特点 3.理解构造函数、析构函数的作用 重点:掌握类的定义与实现,…

很清楚展示GPT插件的调用过程,人工智能(AI)的潜在危险与好处 超级智能 未来

好处&#xff0c;未来 很清楚展示GPT插件的调用过程&#xff1a; 把请求和要求发chatGPT chatGPT返回markdown格式发给插件 插件返回结果给用户。 你不用别人用。 人工智能&#xff08;AI&#xff09;的最危险之处通常与以下几个方面有关&#xff1a; 自主决策能力过强&…