第三期:那些年,我们一起经历过的链表中的浪漫

简介: 第三期:那些年,我们一起经历过的链表中的浪漫

PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。


1. 两个链表的第一个公共节点

“我走过我的世界,再从你的世界走一遍”

“你走过你的世界,再从我的世界走一遍”

“最终我们将相遇,可能在途中,可能在结尾。”

题目描述

输入两个链表,返回它们的公共节点。如没有公共节点返回null。

示例1

输入:listA = [1,2,3,4,5], listB = [6,7,2,3,4,5]

输出:value为8的节点

示例2

输入:listA = [1,2,3,4,5,6,7], listB = [8,9,6,7]

输出:value为6的节点

解析

这道题可以运用哈希集合,直接把一个链表的所以节点放入,然后在遍历另一条链表节点,遍历到第一个集合包含的节点,便是公共节点,返回此节点。如没有,返回null。

但这样空间复杂空为O(M + N);那有没有空间复杂度为O(1)的方法呢?答案是有的,这就要请出我们浪漫的双指针了。

我们构建两个节点指针p1, p2,p1 = headA,p2 = headB,让它们分别遍历自己的链表,在途中如果 p1 == p2,则返回p1 ,或则当p1 == null时,让p1 = headB,p2 == null时,p2 = headA,继续遍历,这次一定会经历p1 == p2,返回p1即可。

一句话:

你变成我,走过我走过的路。

我变成你,走过你走过的路。

然后我们便相遇了。

两个节点不断的寻找对方的身影,双向奔赴的爱情,岂不浪漫。


2.链表中间节点

题目描述

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点

示例1

输入:[1,2,3,4,5]

输出:value值为3的节点

示例2

输入:[1,2,3,4]

输出:value值为3的节点

解析

为了找到你想要的,我可以忍受孤独,我可以付出一切,我愿意先行。

这道题也可以运用双指针,定义两个指针,一个是慢指针slow,另一个是快指针fast。初始,慢指针slow和快指针fast都指向链表的头节点。然后,快指针fast每次向前移动两步,慢指针slow每次向前移动一步,当快指针fast不能继续向前移动时,慢指针slow所指的节点就是中间节点。


答案

1.两个链表中第一公共节点

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //如果这个世界没有你
        if (headA == null || headB == null) {
            //我活着又有什么意义
            return null;
        }
        //为了寻找你
        ListNode pA = headA, pB = headB;
        //我们彼此开始努力
        while (pA != pB) {
            //在这平行世界中携手共进
            //寻找彼此的踪迹
            //没人把这当作游戏
            //互相探寻对方世界的奥秘
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        //是的,爱情能够创造奇迹
        //我们永远不分离
        return pA;
    }


2.链表中间节点

    public ListNode middleNode(ListNode head) {
        //你说你喜欢那个东西
        ListNode slow = head;
        ListNode fast = head;
        //我愿意忍受孤独,先行
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        //祝你安好
        return slow;
    }


目录
相关文章
|
存储 JSON NoSQL
Node.js使用数据库LevelDB:超高性能kv存储引擎
Node.js被设计用来做快速高效的网络I/O。它的事件驱动流使其成为一种智能代理的理想选择,通常作为后端系统和前端之间的粘合剂。Node的设计初衷就是为了实现这一目的,但与此同时,它已成功用于构建传统的Web应用程序:一个HTTP服务器,提供为HTML页面或JSON消息响应,并使用数据库存储数据。
960 0
Node.js使用数据库LevelDB:超高性能kv存储引擎
|
机器学习/深度学习 人工智能 自然语言处理
2024年AIGC有哪些趋势?
【1月更文挑战第16天】2024年AIGC有哪些趋势?
314 5
2024年AIGC有哪些趋势?
|
9月前
|
人工智能 弹性计算 运维
OS Copilot
作为一名运维工程师,我发现OS Copilot安装便捷、文档详尽,适用于多种系统(如Debian)。其主要缺点是缺乏记忆性,无法记住之前的交互内容。然而,它能检测发行版并提出详细的解决方案,通过指令轻松执行,大大简化了日常运维工作。内嵌系统的优势使其对配置了解透彻,极大提升了工作效率。如果能改进记忆功能,将更有力地辅助甚至部分替代运维人员的工作。
OS Copilot
|
传感器 C# Android开发
深度解析Uno Platform中的事件处理机制与交互设计艺术:从理论到实践的全方位指南,助您构建响应迅速、交互流畅的跨平台应用
Uno Platform 是一款开源框架,支持使用 C# 和 XAML 开发跨平台原生 UI 应用,兼容 Windows、iOS、Android 及 WebAssembly。本文将介绍 Uno Platform 中高效的事件处理方法,并通过示例代码展示交互设计的核心原则与实践技巧,帮助提升应用的用户体验。事件处理让应用能响应用户输入,如点击、触摸及传感器数据变化。通过 XAML 或 C# 添加事件处理器,可确保及时反馈用户操作。示例代码展示了一个按钮点击事件处理过程。此外,还可运用动画和过渡效果进一步增强应用交互性。
280 57
|
12月前
EasyX之跳跳球
本文介绍了如何使用EasyX库开发一个跳跳球游戏,包括绘制小球和矩形、实现小球的起跳与下落、处理矩形的移动、解决小球二次起跳问题、判断游戏结束条件以及打印分数。
183 0
EasyX之跳跳球
|
数据安全/隐私保护
CI/CD笔记.Gitlab系列.新用户管理
CI/CD笔记.Gitlab系列.新用户管理
212 1
|
12月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
303 0
|
负载均衡 NoSQL 关系型数据库
Nginx+keepalived实现高可用集群
大型企业架构一般是用户先访问到四层负载均衡,在由四层负载均衡转发至七层服务在均衡,七层负载均衡再转发至后端服务器,四层负载均衡只起到一个分流的作用,根据用户访问的端口,比如说80端口就会跳转至七层的对应的集群,两台四层负载均衡配置是一模一样的,形成高可用,七层的配置也是一模一样的,当有1500个请求需要响应时,四层负载均衡就会平均将1500个请求分给急群中的lb,每个lb响应500个请求,减轻单点的压力。
1930 0
Nginx+keepalived实现高可用集群
|
Shell 应用服务中间件 nginx
Docker命令集大全(Docker命令,一篇搞定)
【1月更文挑战第12天】 一、Docker容器命令: 二、Docker镜像命令 三、重启Docker命令 四、Docker数据卷命令 五、挂载数据卷
607 3
|
存储 算法 Java
“JDK简介:探索Java开发的核心工具包“
Java编译器(javac):JDK包含了Java编译器,可以将Java源代码编译为Java字节码。通过编译器,开发人员可以将Java源代码转换为可在JVM上运行的字节码文件。 核心类库(Core Libraries):JDK提供了丰富的核心类库,其中包含了常用的类和接口,用于处理字符串、集合、IO、网络通信等各种操作。开发人员可以利用这些类库来构建功能丰富的Java应用程序。 调试工具(Debugging Tools):JDK提供了一系列的调试工具,例如Java命令行调试器(jdb)、Java虚拟机调试接口(JVMTI)和Java VisualVM等。这些工具可以帮助开发人员查找和修复Jav
430 0