力扣刷题TOP101:8.BM10 两个链表的第一个公共结点

目录:

目的

思路

复杂度

记忆秘诀

python代码

目的

两个无环的单向链表,它们的第一个公共结点{{6,7}。


思路

这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏,实际上背地里都偷偷上各种补习班。小明有一套补习pHead1,小红有一套补习pHead2。他们不仅上完自己的课,还要偷偷上对方的,要卷死对方,但是他们忽略了一点,如果有共同的补习班会再某时候碰上,就要翻车社死了。


心机boys登场:

  • 小明(p1指针):小明有一套自己的补习计划 pHead1,从头到尾按照顺序上课。

  • 小亮(p2指针):小亮则有另一套补习计划 pHead2,也是从头开始按顺序上课。


开始补课

  • 先完成自己的补课计划
    小明和小亮各自按照自己的计划上课p1 = p1.next,p2 = p2.next。

  • 偷偷上对方的课
    当小亮上完所有补习班后,他偷偷跑到小亮的第一个补习班继续补课p1 = pHead2;
    同样,小亮也偷偷跑到小亮 的第一个补习班继续补p2 = p2.next。


翻车时刻

  • 翻车时刻p1 == p2:
    如果有共同的补习班,他们迟早会在这个补习班里翻车碰面社死。这个补习班就是他们的“第一个公共节点”。

    • 为什么一定会翻车?(具体可查看下方数学推导)

      • 因为小明和小亮总会上完整两套补习计划(自己的和对方的),所以只要有相同的补习班,就一定能在第一个相同的课上碰上。
  • 没公共课怎么办
    如果两个计划完全不重合,他们最终都会上完对方的课,开心回家(return p1)。


复杂度

  • 时间复杂度:O(n)

    • 两个心机boy的上课过程相当于遍历两个链表,每个节点最多访问两次,总共为 O(m+n)(m 和 n是链表的长度)即O(n)。
  • 空间复杂度:O(1)

    • 只有两个心机boy(两个指针变量),不多花内存。

记忆秘诀

  • 心机boy上课策略:上自己的补习计划 -> 偷偷上对方的补习计划 -> 碰面社死翻车。

  • 翻车条件:他们最终会在第一个共同的补习班上撞个正着,这就是“第一个公共节点”。如果没公共课,那就各回各家、各找各妈。


补充:数学推导

设定        

  1. 链表A长度为LA,链表B 长度为LB。
  2. 两链表公共部分长度为 LC(第一个公共节点到链表尾部的长度)。
  3. 非公共部分:
    • 链表A的独占部分为 LAbefore = LA - LC。
    • 链表B的独占部分为 LBbefore = LB - LC。

指针P1和P2的移动逻辑:

  1. 指针P1:
    • 从链表 A的头节点出发,依次走完链表 A,然后切换到链表B。
    • 总路径: LAbefore + LC + LBbefore + LC
  2. 指针P2:
    • 从链表B的头节点出发,依次走完链表B,然后切换到链表A。
    • 总路径: LBbefore + LC + LAbefore + LC

总结: 两指针各自遍历两条链表的总路径相等:

          LAbefore + LC + LBbefore + LC = LBbefore + LC + LAbefore + LC

相遇条件:

  1. 当指针P1 和 P2交换链表后:

    • P1进入链表B,P2进入链表A,
    • 由于他们行走的总路径相同,必然会在公共部分 LC的起点(即第一个公共节点)相遇。
  2. 如果两个链表没有公共部分(即 LC=0),两指针最终会同时走到 None,也满足终止条件。

直观解释

  • 两个指针通过在链表间“交叉跑”,平衡了两链表的长度差异。
  • 当两指针的行走路径一致时,自然会在第一个公共节点 C相遇。

python代码

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None#
# 
# @param pHead1 ListNode类 
# @param pHead2 ListNode类 
# @return ListNode类
#
class Solution:def FindFirstCommonNode(self, pHead1: ListNode, pHead2: ListNode) -> ListNode:if not pHead1 or not pHead2:# 如果有一个补习计划为空,则不可能有共同补习班return None  # 如果其中一个链表为空,则没有公共节点p1 = pHead1 # 小明从pHead1开始p2 = pHead2 # 小亮从pHead2开始# 当小明和小亮没有碰面时,继续上课# 遍历两个链表,直到找到公共节点或者都为Nonewhile p1 != p2:# 如果p1走到末尾,切换到pHead2;否则继续走# 如果小明的课上完了,就转去上小亮的,否则继续上自己的# p1 = p1.next if p1 else pHead2(简写)if p1:  # 如果 p1 不是空p1 = p1.next  # 继续往下走else:  # 如果 p1 是空p1 = pHead2  # 切换到链表2的头节点# 如果p2走到末尾,切换到pHead1;否则继续走# 如果小红的课上完了,就转去上小明,否则继续上自己的# p2 = p2.next if p2 else pHead1(简写)if p2:  # 如果 p2 不是空p2 = p2.next  # 继续往下走else:  # 如果 p2 是空p2 = pHead1  # 切换到链表1的头节点# 相遇点即为第一个公共节点,或者如果没有公共节点则为None# 碰面的补习班(公共节点),或者没有碰面(返回 None)return p1

* 欢迎大家探讨新思路,能够更好的理解和记忆

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

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

相关文章

哪些行业对六西格玛管理方法的需求较大?

六西格玛作为一种追求极致质量和流程优化的管理哲学,自诞生以来,便在多个行业中展现出了巨大的应用价值。该方法通过定义、测量、分析、改进和控制(DMAIC)五个阶段,帮助企业实现流程的持续改进,提高产品质量…

Spring Web MVC其他扩展(详解下)

文章目录 Spring MVC其他扩展(下)异常处理异常处理机制声明式异常好处基于注解异常声明异常处理 拦截器拦截器概念拦截器使用拦截器作用位置图解拦截器案例拦截器工作原理源码 参数校验校验概述操作演示SpringMVC自定义参数验证ValueObject(VO) 文件上传…

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…

【linux学习指南】Linux进程信号产生(三) 硬件异常除零出错?野指针异常?core文件

文章目录 📝前言🌠模拟除0🌉除0出错?🌉野指针异常? 🌠⼦进程退出coredump🌉Core Dump 🚩总结 📝前言 硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前…

【人工智能-科普】图神经网络(GNN):与传统神经网络的区别与优势

文章目录 图神经网络(GNN):与传统神经网络的区别与优势什么是图神经网络?图的基本概念GNN的工作原理GNN与传统神经网络的不同1. 数据结构的不同2. 信息传递方式的不同3. 模型的可扩展性4. 局部与全局信息的结合GNN的应用领域总结图神经网络(GNN):与传统神经网络的区别与…

青藤云安全携手财信证券,入选金融科技创新应用优秀案例

11月29日,由中国信息通信研究院主办的第四届“金信通”金融科技创新应用案例评选结果正式发布。财信证券与青藤云安全联合提交的“基于RASP技术的API及数据链路安全治理项目”以其卓越的创新性和先进性,成功入选金融科技创新应用优秀案例。 据悉&#x…

Python系列 - MQTT协议

Python系列 - MQTT协议 资源连接 MQTT的介绍和应用场景的示例说明 一、什么是MQTT 百度关于MQTT的介绍如下: MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布订阅范式的消息协议。它工作在 TCP/IP协议之上,是为硬件性能低下的远程设…

winform跨线程更新界面

1、报错代码 下面的代码中的this.Text指的是一个winform的窗体,开启Task执行下面的代码以后直接报错,提示线程间操作无效,这是因为在WinForms应用程序中,UI元素(如控件)通常只能在创建它们的线程&#xff…

Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看:Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1,编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数,…

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术,广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性,通过对当前数据的预测和实际值与预测值之间的差值进行编码,从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…

5. langgraph实现高级RAG (Adaptive RAG)

1. 数据准备 from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import Chromaurls ["https://lilianweng.github.io/posts/2023-06-23-age…

自动化配置

自动化配置共享目录 nfs:共享某个目录,共享给哪些客户端,rw(读写)——rwx(给目录权限设置),ro(只读) 写脚本 1、装包 可以调用仓库之前装包的脚本 &#x…

AtomicIntegerFieldUpdater能否降低内存

1. 代码如下: import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTest {final AtomicInteger startPosition new AtomicInteger(0);final AtomicInteger wrotePosition new Atom…

微服务即时通讯系统的实现(服务端)----(3)

目录 1. 消息存储子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 数据管理1.4.1 数据库消息管理1.4.2 ES文本消息管理 1.5 接口的实现1.5.1 消息存储子服务所用到的protobuf接口实现1.5.2 最近N条消息获取接口实现1.5.3 指定时间段消息搜索接口实现1.5.4 关键字消…

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子,还有数据中台、数据湖、数据仓库、数据集市的区别的帖子,发现帖子写的都很多,而且专业名词很多&am…

202页MES项目需求方案深入解读,学习MES系统设计规划

202页MES项目需求方案深入解读,学习MES系统设计规划 MES项目需求方案旨在实现制造执行、效率提升、精细化管理等多个方面的功能。整体结构分为七大部分,包括制造执行、效率、精细化、品质在线、设备、用户思想和数据互联。制造执行部分关注订单、品质数据…

基础(函数、枚举)错题汇总

枚举默认从0开始,指定后会按顺序赋值 而这个枚举变量X,如果在全局(函数外部)定义,那默认为0,如果在函数内部(局部变量),那就是随机值,必须初始化。 枚举变量…

互联网基础

TCP/IP协议(协议组) 分层名称TCP/IP协议应用层HTTP,FTP,mDNS,WebSocket,OSC...传输层TCP,UDP网络层IP链路层(网络接口层)Ethernet,Wi-Fi... 链路层(网络接口层) 链路层的主要作用…

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接: 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】&…

用MATLAB符号工具建立机器人的动力学模型

目录 介绍代码功能演示拉格朗日方法回顾求解符号表达式数值求解 介绍 开发机器人过程中经常需要用牛顿-拉格朗日法建立机器人的动力学模型,表示为二阶微分方程组。本文以一个二杆系统为例,介绍如何用MATLAB符号工具得到微分方程表达式,只需要…