【链表】- 环形链表 II

1. 对应力扣题目连接

  • 环形链表 II

2. 实现思路

a. 链表图示:

在这里插入图片描述

b. 检测链表中是否存在环,即:会相交

思路:

  • 使用 Floyd 的龟兔赛跑算法(Floyd’s Tortoise and Hare algorithm),即快慢指针法,可以有效解决此问题。

方案:

  • 初始化两个指针,慢指针 (slow) 每次走一步,快指针 (fast) 每次走两步。
    如果链表中存在环,快指针和慢指针最终会在环内相遇。
    如果链表无环,快指针会先到达链表末端。如上图示。
c. 找到环的起点,即:环形入口点

思路:

  • 因为环会相交,所有里程数一定相等,而快慢指针的速度差为2:1;
  • 所以:快慢总的里程等式为(n代表快指针的圈数):(x+y)* 2 = x+y + n(y+z)
  • 推算:
  • x+y = n(y+z)
  • x = n(y+z) -y
  • x = (n-1)(y+z) +z
  • 如:n=1;则 x=z

方案:

  • 当快慢指针在环内相遇时,将其中一个指针重置到链表头部。
  • 两个指针每次都只走一步,当它们再次相遇时,相遇的节点即为环的起点。

3. 实现案例代码

public class CircularListIiTwo {

    public static void main(String[] args) {

        // 示例链表:[3,2,0,-4],尾部连接到索引 1
        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 cycleNode = detectCycle(head);
        if (cycleNode != null) {
            System.out.println("Cycle starts at node with value: " + cycleNode.val);
        } else {
            System.out.println("No cycle");
        }
    }

    public static ListNode detectCycle(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        }

        ListNode slow = head;
        ListNode fast = head;

        // 使用快慢指针检测环
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;

            // 快慢指针相遇,说明存在环
            if (slow == fast) {
                ListNode ptr = head;

                // 找到环的起点
                while (ptr != slow) {
                    ptr = ptr.next;
                    slow = slow.next;
                }
                return ptr;
            }
        }
        // 无环
        return null;
    }
}

class ListNode {
    public int val;
    public ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享

ChatGPT高质量prompt技巧分享pdf, ChatGPT提问获取高质量答案的艺术pdf。本书是一本全面的指南,介绍了各种 Prompt 技术的理解和利用,用于从 ChatGPTmiki sharing中生成高质量的答案。我们将探讨如何使用不同的 Prompt 工程技术来实现不同的目…

AI网络爬虫021:下载m3u8视频文件

文章目录 一、介绍二、输入内容三、输出内容一、介绍 要下载m3u8视频文件,首先得找到m3u8地址,按下F12键,看网络-fetch/xhr,然后找网址中包括m3u8的地址,再预览或者看下相应 https://1304688195.vod2.myqcloud.com/9d058fb7vodtranscq1304688195/1194c6da1253642699220090…

CDGA|数据治理:如何建立健全数据伦理和隐私保护机制?

随着数字化时代的到来,数据已成为推动社会进步和企业发展的重要资源。然而,随之而来的数据伦理和隐私保护问题也日益凸显。建立健全的数据治理体系,特别是强化数据伦理和隐私保护机制,已成为当务之急。 数据治理的重要性 数据治理…

完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效!!!

完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效!!! 亲测有效 完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效&#xff0…

详细分析Java中的@EventListener事件监听器(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)Spring框架从入门到学精(全) 1. 基本知识 用于标注一个方法为事件监听器 事件监听器方…

不坑盒子是干啥的?

不坑盒子是一款专为提升办公效率设计的插件,它兼容Microsoft Office和WPS Office,支持Word、Excel、PPT等常用办公软件。这款插件自2024年初开始受到关注,其主要目的是为了让用户在日常办公中能够更加便捷地完成任务,从而提高工作…

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…

MapReduce底层原理详解:大案例解析(第32天)

系列文章目录 一、MapReduce概述 二、MapReduce工作机制 三、Map,Shuffle,reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交:2. Map阶段&…

六、数据可视化—Echars(爬虫及数据可视化)

六、数据可视化—Echars(爬虫及数据可视化) Echarts应用 Echarts Echarts官网,很多图表等都是我们可以 https://echarts.apache.org/zh/index.html 是百度自己做的图表,后来用的人越来越多,捐给了orange组织&#xf…

Django项目创建的准备工作【3】

【 一 】建立数据库 创建库: 命令(指定编码) 创建用户: 并授权 用户: luffy: 密码xxxxxx , 只授予luffy库权限 使用mysql创建lufy数据库 root账号和密码--->万一泄露---》整个数据库就不安全了。 创建个用户,这个用户只对当前项目 库 有…

不同材质酒店智能开关的功能特点详解

在当今的酒店行业中,智能开关已成为提升客户体验和管理效率的重要设备。而不同材质的智能开关,不仅在外观上各具特色,其功能特点也有所差异。 玻璃材质智能开关: 玻璃材质的智能开关给人一种时尚、简约且高端的感觉。其表面光滑&a…

前端面试39(关于git)

针对前端开发者的Git面试题可以覆盖Git的基础概念、常用命令、工作流程、团队协作、以及解决冲突等方面。以下是一些具体的Git面试 Git基础知识 什么是Git? Git是一个分布式版本控制系统,用于跟踪计算机文件的更改,并协调多个人共同在一个项…

tensorflow张量生成以及常用函数

张量tensor:多维数组(列表) 阶:张量的维数 维数 阶 名字 例子 0-D 0 标量 scalar s 1, 2, 3 1-D 1 向量 vector…

JS进阶-原型

学习目标: 掌握原型 学习内容: 原型constructor属性对象原型原型继承原型链综合案例 原型: 构造函数通过原型分配的函数是所有对象所共享的。 JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象&…

vscode c++可以找到声明却无法自动补全

这个问题折磨了我将近一个月,今天终于被解决了,特此记录 情景再现 事情的起因是我在学习华为的Ascend C算子,需要编写C代码。关于怎么下载库文件怎么编译之类的不是本文的重点,重点是自动补全。 我已经拿到库文件了&#xff0c…

力扣题解(设计跳表)

1206.设计跳表 已解答 不使用任何库函数,设计一个 跳表 。 跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。 …

Linux文件编程应用

目录 一、实现cp命令 二、修改程序的配置文件 三、写一个整数/结构体到文件 1.写一个整数到文件 2.写一个结构体到文件 四、写结构体数组到文件 我们学习了文件编程的常用指令以及了解文件编程的基本步骤后,试着来写一些程序实现某些功能。(没有学…

oracle哪些后台进程不能杀?

oracle 有很多的后台进程,在遇到特殊情况的时候如锁表,如果等待的是一个后台进程,那这时就需要考量是不是能杀掉这个后台进程?杀掉这个后台进程会不会引起实例崩溃?本着实践出真知,本文针对oracle 11g&…

昇思25天学习打卡营第23天 | Pix2Pix实现图像转换

内容介绍: Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的,可以实现语义/标签到真实图片、灰…