算法的学习笔记—两个链表的第一个公共结点(牛客JZ52)

在这里插入图片描述

img

😀前言
在链表问题中,寻找两个链表的第一个公共结点是一个经典问题。这个问题的本质是在两个单链表中找到它们的相交点,或者说它们开始共享相同节点的地方。本文将详细讲解这个问题的解题思路,并提供一种高效的解决方法。

🏠个人主页:尘觉主页

文章目录

  • 🥰两个链表的第一个公共结点
    • 😄题目描述
    • 😊问题描述
    • 🥳解题思路
      • 时间复杂度和空间复杂度分析
    • 💝代码实现
      • 代码详解
      • 示例
    • 😄总结

🥰两个链表的第一个公共结点

NowCoder

😄题目描述

image-20241023224650357

😊问题描述

给定两个单向链表,找出它们的第一个公共节点。如果两个链表没有交点,则返回 null。这意味着链表从某个结点之后开始共享相同的后续节点。需要注意的是,这里的"公共"结点不是指值相同,而是指两个链表引用的同一个结点,即在内存中的地址相同。

🥳解题思路

解决这个问题的核心在于如何找到链表的第一个公共节点。可以通过观察链表的结构来思考:

设链表 A 的长度为 a + c,其中 a 是链表 A 不与链表 B 共享的部分的长度,c 是 A 和 B 共有的部分长度。同样地,设链表 B 的长度为 b + c,其中 b 是链表 B 不与链表 A 共享的部分。两条链表在某个节点开始共享尾部节点,因此可以得到以下等式:

  • 链表 A 的总长度 = a + c
  • 链表 B 的总长度 = b + c

可知:

  • 如果我们从头开始遍历链表 A 和链表 B,由于它们的长度不同,直接同时遍历无法保证两条链表的指针在公共部分的第一个节点相遇。
  • 但是,如果我们遍历完一条链表后,切换到另一条链表继续遍历,则可以通过控制遍历的顺序来同步两个指针的速度。即遍历完链表 A 后从链表 B 的头部重新开始遍历,同样地,遍历完链表 B 后从链表 A 的头部重新开始遍历。

通过这样的方式,两个指针会在相同的时刻访问到链表的公共部分。具体步骤如下:

  1. 初始化两个指针 l1l2,分别指向链表 A 和链表 B 的头节点。
  2. 如果 l1l2 不相等,则分别遍历链表 A 和 B。当某个指针到达尾部时,切换到另一条链表的头部继续遍历。
  3. 当两个指针相遇时,返回该指针所指向的节点,即第一个公共节点。

时间复杂度和空间复杂度分析

  • 时间复杂度: O(m + n),其中 mn 分别是链表 A 和 B 的长度。每个指针遍历链表的次数最多为两次,因此时间复杂度为 O(m + n)。
  • 空间复杂度: O(1),只用了两个指针来进行遍历,因此不需要额外的空间。

💝代码实现

下面是基于上述思路的 Java 实现代码:

public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {ListNode l1 = pHead1;ListNode l2 = pHead2;// 当两个指针不相等时,继续遍历while (l1 != l2) {// l1 先走完链表 A,转向链表 Bl1 = (l1 == null) ? pHead2 : l1.next;// l2 先走完链表 B,转向链表 Al2 = (l2 == null) ? pHead1 : l2.next;}// 相遇时即为第一个公共结点,或者为 null(无公共节点)return l1;}
}

代码详解

  1. ListNode 类:定义了链表的节点结构,每个节点包含一个整数值 val 和指向下一个节点的指针 next
  2. FindFirstCommonNode 方法:该方法接受两个链表的头节点作为参数,并返回第一个公共节点。遍历链表的方式如前面所述,通过指针的切换,两个指针会在公共节点相遇。

示例

考虑以下两个链表:

链表 A: 1 -> 2 -> 3 -> 6 -> 7
链表 B: 4 -> 5 -> 6 -> 7

在这种情况下,链表 A 和 B 的第一个公共节点是 6。通过上述方法,程序会正确找到该节点。

😄总结

通过同步两个指针的遍历方式,能够有效地解决两个链表寻找第一个公共节点的问题。该方法的时间复杂度为 O(m + n),空间复杂度为 O(1),在链表问题中是非常高效的一种解法。这种技巧值得学习,因为它不仅解决了本题,还可以运用于其他链表相关的题目中,比如寻找链表的环起点等。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

蓝牙资讯|iOS 18.1 正式版下周推送,AirPods Pro 2耳机将带来助听器功能

苹果公司宣布将在下周发布 iOS 18.1 正式版,同时确认该更新将为 AirPods Pro 2 耳机带来新增“临床级”助听器功能。在启用功能后,用户首先需要使用 AirPods 和 iPhone 进行简短的听力测试,如果检测到听力损失,系统将创建一项“个…

docker run 命令解析

docker run 命令解析 docker run 命令用于从给定的镜像启动一个新的容器。这个命令可以包含许多选项,下面是一些常用的选项: -d:后台运行容器,并返回容器ID;-i:以交互模式运行容器,通常与 -t …

【C++】string类 (模拟实现详解 下)

我们接着上一篇【C】string类 (模拟实现详解 上)-CSDN博客继续对string模拟实现。从这篇内容开始,string相关函数的实现就要声明和定义分离了。 1.reserve、push_back和append 在string.h的string类里进行函数的声明。 void reserve(size_…

JVM(HotSpot):GC之垃圾回收器的分类

文章目录 前言一、串行二、吞吐量优先三、响应时间优先四、常见垃圾回收器使用组合 前言 上一篇,我们学习了分代回收机制 它的主要内容是对JVM内存的一个划分,以及垃圾回收器工作时,区域运作顺序的一个规定。 所以,它是一个规范。…

Spring Boot论坛网站:开发、部署与管理

3系统分析 3.1可行性分析 通过对本论坛网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本论坛网站采用SSM框架,JAVA作为开发语言,是…

智慧楼宇平台,构筑未来智慧城市的基石

随着城市化进程的加速,城市面临着前所未有的挑战。人口密度的增加、资源的紧张、环境的恶化以及对高效能源管理的需求,都在推动着我们寻找更加智能、可持续的城市解决方案。智慧楼宇作为智慧城市建设的重要组成部分,正逐渐成为推动城市可持续…

MATLAB电化学特性评估石墨和锂电

🎯要点 模拟对比石墨电池的放电电压曲线与实验数据定性差异。对比双箔、多相多孔电极理论和锂电有限体积模型实现。通过孔隙电极理论模型了解粗粒平均质量和电荷传输以及孔隙率的表征意义。锂电中锂离子正向和逆向反应速率与驱动力的指数以及电解质和电极表面的锂浓…

Docker 部署 EMQX 一分钟极速部署

部署 EMQX ( Docker ) [Step 1] : 拉取 EMQX 镜像 docker pull emqx/emqx:latest[Step 2] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/emqx/{etc,data,log}# 创建容器 docker run -d --name emqx -p 1883:1883 -p 1808…

「Qt Widget中文示例指南」如何实现半透明背景?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将为大家展示如…

《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优

1. 题记 有关Linux关键内核参数的调整,我前面的调优文章其实就有涉及到,只是比较零散,本篇集中深入介绍Linux常用关键内核参数及其调优,Linux调优80%以上都涉及到内核的这些参数的调整。 2. 文件系统相关参数 fs.file-max 参数…

Excel 对数据进行脱敏

身份证号脱敏:LEFT(A2,6)&REPT("*",6)&RIGHT(A2,6) 手机号脱敏:LEFT(B2,3)&REPT("*",5)&RIGHT(B2,3) 姓名脱敏:LEFT(C2,1)&REPT("*",1)&RIGHT(C2,1) 参考: excel匹配替换…

STM32F103C8T6 IO 操作

1.开启相关时钟 在 STM32 微控制器中,开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。 查找 RCC 寄存器使能时钟 在 STM32 中,时钟控制的寄存器通常位于 RCC (Reset and Clock Control) 模块中。不同的 STM32 系列(如 STM32F1、STM…

【单元测试】深入解剖单元测试的思维逻辑

目录 一、前言二、准备环境三、 常用的mock语句3.1 模拟指定类的对象实例,用于模拟依赖对象(类成员)3.2 定义被测试对象3.3 模拟枚举类型/静态方法3.4 模拟依赖方法3.5 模拟构造方法3.6 验证方法调用次数3.7 验证返回值3.8 验证异常对象 四、…

第十六周:机器学习笔记

第十六周周报 摘要Abstratc一、机器学习1. Pointer Network(指针网络)2. 生成式对抗网络(Generative Adversarial Networks | GAN)——(上)2.1 Generator(生成器)2.2 Discriminator&…

ssm企业库存管理微信小程序-计算机毕业设计源码82704

摘 要 本文基于SSM框架,设计与实现了一个企业库存管理微信小程序。该小程序主要包括用户登录、库存查询、入库操作、出库操作等功能模块。在设计过程中,采用了前后端分离的架构,前端使用了微信小程序原生开发工具进行开发,后端使用…

【C++篇】探索STL之美:熟悉使用String类

CSDN 文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&…

ApacheShiro反序列化 550 721漏洞

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理个漏洞被称为 Shiro550 是因为在Apache Shiro的GitHub问题跟踪器中,该漏洞最初被标记为第550个问题,721漏洞名称也是由此而来 Shiro-550 CVE-2016-4437 Shiro反序列化Docker复现 …

Android GPU Inspector分析帧数据快速入门

使用 谷歌官方工具Android GPU Inspector (AGI) 可以对Android 应用进行深入和全面的系统性能分析和帧性能分析 。AGI 是一个非常强大的分析工具,尤其是在需要诊断 GPU 性能问题和优化应用时,可以帮助你精准找到性能瓶颈。本文介绍如何使用该工具对帧数据…

HTTP Proxy环境下部署Microsoft Entra Connect和Health Agents

在企业环境中,时常需要通过使用HTTP Proxy访问Internet,在使用HTTP Proxy访问Internet的环境中部署Microsoft Entra Connect和Microsoft Entra Connect Health Agents可能会遇到一些额外的配置步骤,以便这些服务能够正常连接到Internet。 一…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件,执行shell命令_shell在pycharm-CSDN博客 和深度学习:PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后,发现在Windows的PyCharm中直接右键运行sh文件,存在如下…