算法的学习笔记—两个链表的第一个公共结点(牛客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,一经查实,立即删除!

相关文章

LeetCode Hot 100:二叉树

LeetCode Hot 100:二叉树 94. 二叉树的中序遍历 思路 1:递归 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}…

蓝牙资讯|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_…

qt获取本地语言

获取本地语言 #define QSTRING_TO_UTF8(str) std::string(str.toUtf8()) enum LanguageType {kLanguageTypeChinese,kLanguageTypeTradition,kLanguageTypeEnglish };QLocale qlLanguage;QString qstrLangCode qlLanguage.languageToString(qlLanguage.language());LOG(INFO)…

Python包——Matplotlib

Matplotlib 是 Python 中一个广泛使用的绘图库,它能够生成高质量的图表和图形。它提供了一个类似于 MATLAB 的绘图框架,使得数据可视化变得简单和直观。下面是一些关于如何使用 Matplotlib 的基础知识和示例。 1.常用API 1.1 绘图类型 函数名称描述Bar…

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

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

Debian会取代CentOS成为更主流的操作系统吗?

我们知道,其实之前的话,国内用户对centos几乎是情有独钟的偏爱,很多人都喜欢选择centos系统,可能是受到一些原因的影响导致的吧,比如他相当于免费的红帽子系统,或者一些教程和网上的资料都推荐这个系统&…

idea历史版本下载

idea下载 idea官网默认最新版下载, https://www.jetbrains.com.cn/idea/ 历史版本下载入口: https://www.jetbrains.com/idea/download/other.html

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

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

HTTP 与 HTTPS 的区别:原理、安全性与应用场景

一、引言 在互联网的世界里,信息的传输离不开协议的支持。HTTP 和 HTTPS 是我们在浏览网页、使用网络应用等场景中经常接触到的协议。随着网络安全意识的不断提高,了解 HTTP 和 HTTPS 的区别对于保障网络通信安全和理解网络应用的运行机制变得至关重要。…

针对 el-date picker pickerOptions 快捷选项的超级方法

提供快捷的配置,支持原子组合,高级用法支持用户自定义配置项 demo import { generateShortCuts } from ./date-shortcuts.js ... pickerOptions: {shortcuts: generateShortCuts({type: day}) } ...date-shortcuts 文件 import moment from moment // …

13_Linux开机流程:以Red Hat Enterprise Linux 7(RHEL 7)为例

系列文章导航:01_Linux基础操作CentOS7学习笔记-CSDN博客 文章目录 启动级别的设置启动流程详解RHEL7开机启动顺序 在Red Hat Enterprise Linux 7(RHEL 7)中,系统的启动流程和启动级别的管理方式与旧版本有所不同。本文将详细介绍…

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

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

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

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

【Linux 从基础到进阶】高负载系统的优化与维护

高负载系统的优化与维护 在处理高负载系统时,优化与维护是确保系统稳定性、性能和可扩展性的关键因素。高负载系统通常涉及大量的并发请求、数据处理和资源消耗。为了避免性能瓶颈和服务中断,系统管理员必须从硬件资源、操作系统设置、应用程序优化等多…

word下宏命令添加右键菜单调用大语言模型

word开发者模式下,直接选visual basic,把代码粘贴进去,CrateSelectedTextWithAI()函数下把apikey换成你自己的密钥,我这个密钥不可用。这里调用的是月之暗面的模型(有一定免费额度),其他模型的没…

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…

【贪心算法】(第十篇)

目录 加油站(medium) 题目解析 讲解算法原理 编写代码 单调递增的数字(medium) 题目解析 讲解算法原理 编写代码 加油站(medium) 题目解析 1.题目链接:. - 力扣(LeetCode&a…

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

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