算法的学习笔记—两个链表的第一个公共结点(牛客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.rhkb.cn/news/455249.html

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

相关文章

python 爬虫抓取百度热搜

实现思路: 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一,selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二,安装浏览器Chrome Alpine Linux 环境中没有google Chrome, 使用 Chromium 浏览器作为 Chrome 的替代品,Chromium 是 Chrome 的开源版本…

定时任务使用kafka

定时任务使用kafka 在上述业务场景中使用 Kafka 而不是直接定时执行任务有以下几个重要原因: 一、解耦 任务触发与执行分离: 使用 XXL-JOB 定时触发任务并将任务消息发送到 Kafka,实现了任务触发端(通常是调度系统)和…

数字后端零基础入门系列 | Innovus零基础LAB学习Day5

###Module 12 RC参数提取和时序分析 数字后端零基础入门系列 | Innovus零基础LAB学习Day4 数字后端零基础入门系列 | Innovus零基础LAB学习Day3 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字后端零基础入门系列 | Innovus零基础LAB学习Day1 ###LAB12-1 这个章节…

机器学习与神经网络:科技的星辰大海

前提 近日,2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家,如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

kotlin 入门总结

目录 1、构造函数 2、数据类 data class, 3、object 单例类,相当于java线程安全的懒加载 4、companion object 伴生对象,类似于包装静态值的一个区域块 5、解构 6、空安全 7、条件语句 8、集合 9 属性和支持属性 属性 支持属性 10 …

kali的下载与配置

kali.org官网下载 选择VMware的版本下载,并解压,复制解压后的路径 在虚拟机中,点击文件,打开 默认的账户密码均为kali 修改密码 sudo passwd root 切换root用户 su root 查看IP ip addr IP:192.168.184.131 粘贴复制shiftinsert…

从图像识别到聊天机器人:Facebook AI的多领域应用

随着人工智能技术的快速发展,Facebook已在多个领域内广泛应用AI技术,以提升用户体验、提高效率并推动创新。从图像识别到聊天机器人,Facebook的AI应用涵盖了社交媒体的方方面面,下面我们将深入探讨这些应用的具体实现及其对用户生…

ecmp观察

文章目录 简述选路策略实验说明开始验证 简述 ECMP(Equal Cost Multi Path)等价多路径,又称等价路由。指到达同一个目的IP或者目的网段存在多条COST值相等的不同路由路径。在具有多条到达同一目的地的网络链路的环境中,传统路由技…

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器,由C语言编写,用于用户与操作系统之间进行交互。用户可以通过Shell输入命令,操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能,允许用户…

在 VS Code 中轻松绘图:Draw.io Integration 插件详解

文章目录 在 VS Code 中轻松绘图:Draw.io Integration 插件详解一、什么是 Draw.io Integration 插件?二、插件安装指南1. 安装步骤2. 配置插件 三、如何使用 Draw.io Integration 插件?1. 创建新绘图文件2. 编辑现有图表3. 常用功能与技巧 四…

网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析

作者简介:徐一丁,北京小西牛等保软件有限公司解决方案部总监,网络安全高级顾问。2000年开始从事网络安全工作,主要领域为网络安全法规标准研究、金融行业安全咨询与解决方案设计、信息科技风险管理评估等。对国家网络安全法规标准…

【数据结构与算法】《布隆过滤器:高效数据筛选的魔法工具》

标题:《布隆过滤器:高效数据筛选的魔法工具》 摘要:本文将带你深入了解布隆过滤器这一神奇的数据结构。从研究推荐系统中的已读内容排除和重复内容去重问题引入,详细介绍布隆过滤器的产生契机、设计思想、优缺点及用途。通过阅读…

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成,每个支链包含一个转动关节和一个移动关节,具有结构紧凑、占地面积小、高速高灵活性等特点,可在有限的空间内进行高效的作业,广泛应用于柔性上下料、包装、分拣、装配等需要…

MyBatis 基础知识:配置文件、映射器与 SQL 示例详解

本篇博客将深入探讨 MyBatis 的基础知识,包括配置文件的设置、映射器的使用以及实际的 SQL 示例。 文章目录 前言 准备工作 根据主键删除 日志输出 ​编辑 预编译SQL SQL注入 ​编辑 参数占位符 新增员工 主键返回 更新 查询(根据ID查询&#x…

世界前沿思想升命学说:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪

在当今哲学的前沿探索中,山东济南的名人颜廷利教授的《升命学说》一书以其独到的见解和深刻的洞察力,为我们揭示了十二生肖背后的象征意义。这些生肖包括鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗以及猪,每一种动物都承载着独特的文化寓意…

哥德巴赫猜想渐行渐远

我现在的工作,表明经典分析可能出了问题,如此则连Vinogradov的三素数定理都不成立了,更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立,由于我指出Siegel定理不成立,陈景润和张益唐的工作就不成立。…

卡牌抽卡机小程序,带来新鲜有趣的拆卡体验

随着移动信息技术的发展,小程序得到了快速普及,遍布到了各行各业中,成为企业发展的利器。如今,卡牌抽卡机小程序层出不穷,为玩家带来了更多有趣的拆卡体验。 卡牌在今年中受到了广泛关注,“小马宝莉”等一…

Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable 2、重写run方法,编写子线程的业务逻辑 3、使用QThreadPool的全局方法来开启这个线程 4、线程的回收不需要关注,由QThreadPool处理 5、缺点:无法使用信号槽机制 6、适合一些不需要和主线程通信的耗时的任…

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明:使用的是github提供的Azure OpenAI的服务,可以无限薅羊毛。开源地址 进入: 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…