LeetCode hot 100—相交链表

【力扣hot100题】相交链表(17) 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。给你两个单链表的头节点。 阅读详情

题目

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例

示例 1:

输入:listA = [4,1,8,4,5], listB = [5,6,1,8,4,5]
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例 2:

输入:listA = [1,9,1,2,4], listB = [3,2,4]
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。

示例 3:

输入:listA = [2,6,4], listB = [1,5]
输出:No intersection
解释:这两个链表不相交,因此返回 null 。

分析

哈希集合法

遍历其中一个链表(如链表 A),将链表中每个节点的地址存储到一个哈希集合中。

接着遍历另一个链表(链表 B),对于链表 B 中的每个节点,检查其是否已经存在于哈希集合中。如果存在,那么这个节点就是两个链表相交的起始节点;如果遍历完都没有找到这样的节点,说明两个链表不相交,返回 null。

时间复杂度:O(m+n),其中 m 和 n 分别是链表 headA 和 headB 的长度

空间复杂度:O(m),其中 m 是链表 headA 的长度

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 定义一个哈希集合,用于存储链表 A 中节点的地址
        std::unordered_set<ListNode*> nodeSet;
        // 遍历链表 A,将每个节点的地址存入哈希集合
        ListNode* currentA = headA;
        while (currentA != nullptr) {
            nodeSet.insert(currentA);
            currentA = currentA->next;
        }
        // 遍历链表 B,检查每个节点是否在哈希集合中
        ListNode* currentB = headB;
        while (currentB != nullptr) {
            if (nodeSet.count(currentB) > 0) {
                // 如果当前节点在哈希集合中,说明找到了相交节点
                return currentB;
            }
            currentB = currentB->next;
        }
        // 遍历完链表 B 都没找到相交节点,返回 nullptr
        return nullptr;
    }
};

双指针法

让两个指针 pA 和 pB 从两个链表的头节点开始遍历,当 pA 遍历完链表 A 后,让它从链表 B 的头节点开始继续遍历;同理,当 pB 遍历完链表 B 后,让它从链表 A 的头节点开始继续遍历。这样,如果两个链表相交,那么在某个时刻,pA 和 pB 会指向同一个节点,这个节点就是相交的起始节点;如果两个链表不相交,那么 pA 和 pB 最终都会指向 null。

数学推导

  • 两个链表相交

指针 pA 走过的路程:指针 pA 先遍历链表 A 的不相交部分,长度为 a,再遍历相交部分,长度为 c,然后从链表 B 的头节点开始,遍历链表 B 的不相交部分,长度为 b。所以 pA 走过的总路程为 a + c + b

指针 pB 走过的路程:指针 pB 先遍历链表 B 的不相交部分,长度为 b,再遍历相交部分,长度为 c,然后从链表 A 的头节点开始,遍历链表 A 的不相交部分,长度为 a。所以 pB 走过的总路程为 b + c + a
这意味着在走过上述路程后,pA 和 pB 会在相交节点处相遇

  • 两个链表不相交

指针 pA 走过的路程:pA 先遍历链表 A 的全部长度 a,然后遍历链表 B 的全部长度 b,总路程为 a + b

指针 pB 走过的路程:pB 先遍历链表 B 的全部长度 b,然后遍历链表 A 的全部长度 a,总路程为 b + a
这意味着在走过上述路程后,pA 和 pB 会同时到达链表的末尾(即 nullptr)

时间复杂度:O(m+n),其中 m 和 n 分别是链表 headA 和 headB 的长度

空间复杂度:O(1)

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 如果其中一个链表为空,直接返回 null
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        // 定义两个指针分别指向两个链表的头节点
        ListNode* pA = headA;
        ListNode* pB = headB;
        // 当 pA 和 pB 不相等时,继续遍历
        while (pA != pB) {
            // 如果 pA 遍历完链表 A,让它从链表 B 的头节点开始继续遍历
            pA = (pA == nullptr) ? headB : pA->next;
            // 如果 pB 遍历完链表 B,让它从链表 A 的头节点开始继续遍历
            pB = (pB == nullptr) ? headA : pB->next;
        }
        // 返回相交的起始节点,如果不相交则返回 null
        return pA;
    }
};
Stata:手动安装ivreghdfe包的完整指南与常见问题解决 本文提供了Stata中手动安装ivreghdfe包的完整指南,包括准备工作、详细安装步骤及常见问题解决方案。ivreghdfe作为处理高维固定效应模型的强大工具,依赖ftools、reghdfe和ivreg2三个核心组件,手动安装可避免版本冲突问题。文章还分享了进阶使用技巧,如并行计算加速和保存固定效应估计值,助力用户高效完成工具变量回归分析。 阅读详情

相关推荐

ArcGIS+PLUS+InVEST三件套:从零搞定生态系统服务模拟预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建一套完整的生态系统服务模拟预测工作流。内容涵盖从统一数据预处理、PLUS模型多情景模拟,到InVEST模型量化评估的全过程,并提供了关键脚本和避坑指南,旨在帮助研究者和从业者高效解决土地利用变化与生态系统服务评估结合的实际难题。

weixin_42522857的博客 139

手把手教你学会简单的链表相交问题(LeetCode 160 .相交链表)

一首歌的时间学会链表相交问题,交给我啦!

qq_52777887的博客 3832

SAP生产订单成本‘还原’实战:从标准成本到实际费用,一步步拆解差异来源(附物料分类账提示)

本文深入解析SAP生产订单成本差异分析的全过程,从标准成本到实际费用的追踪方法,揭示差异根源的六维分析法。特别强调物料分类账(CKMLCP)在成本还原中的关键作用,帮助财务人员精准定位价格差异、用量差异等问题,提升制造业成本管理的效率和准确性。

weixin_28705087的博客 534

链表相交问题详解

但是A链表和B链表的长度不相等,我们怎么才能让curA指向a1的同时cueB指向b2呢?

yyykule的博客 1306

频偏估计技术:从原理到5G应用的实战解析

本文深入解析了5G通信中的频偏问题及其核心技术。频偏如同调不准的旋钮,会导致信号失真与载波间干扰。文章详细拆解了整数倍与小数倍频偏估计两大核心方法,重点剖析了基于循环前缀和基于同步信号块的算法原理与优劣,并结合eMBB、mMTC、URLLC三大5G应用场景,提供了实战算法选择策略与参数调优避坑指南。

weixin_29218963的博客 263

ROS牛耕法全覆盖规划:从算法原理到清洁机器人实战解析

本文深入解析ROS牛耕法全覆盖规划算法在清洁机器人中的应用,从算法原理到实战优化技巧全面覆盖。详细介绍了地图预处理、区域分解和路径优化等关键步骤,并分享实际案例中的解决方案,帮助开发者提升机器人清扫效率和覆盖率。

weixin_27013291的博客 392

代码随想录链表篇——链表相交(三种方法)

刷题总结

qq_39473176的博客 1384

利用Android系统漏洞实现后台弹窗(外弹)

关键:从 Android 8.0(API 26)开始,禁止使用 context.sendBroadcast() 发送隐式广播(即没有指定 setPackage() 或明确组件的广播)。demo核心代码展示利用Android显示系统和广播系统的漏洞实现在后台弹窗的功能,支持最新Android15,16版本。核心功能都是在so层去做,大量使用了jni反调, 如果要上架到应用市场,需要对代码做进一步混淆,加固以应对市场安全扫描。3,开启虚拟显示窗口,这是个透明像素窗口。5,可开启一个线程,调用这个外弹窗口。

2018,再出发~ 1316

力扣---LeetCode160. 相交链表(代码详解+流程图)

第十弹 --- 力扣LeetCode每日一题

小沈.的博客 1837

Java面试题大全(2025版)

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

2401_89221704的博客 2442

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 299

两链表相交问题

两单向链表相交问题 一、问题分析 (1)两个链表相交,那么两个链表中的节点一定有相同地址。 (2)两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。 (问:为什么? 答:因为每一个节点最多只能有一个下一节点,因此在相交节点之后,链表不可能再分为两个链表) 二、问题解法 根据两个链表是否存在环来分类讨论 1、无环 无环的情况有两种比较快速的解决方式,这两种方...

linchonghui888的博客 2204

Juniper SRX PPPoE配置

set interfaces pp0 unit 1 ppp-options chap default-chap-secret 拨号用户名密码。set interfaces pp0 unit 0 ppp-options chap default-chap-secret 拨号密码。set interfaces pp0 unit 0 ppp-options chap local-name 拨号用户名。6号口接运营商进行拨号。

Jian Sun_的博客 750

力扣 Hot 100 刷题记录 - 相交链表

编写一个程序,找到两个单链表相交的起始节点。如果两个链表没有交点,返回null。

weixin_50893711的博客 467

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【力扣hot100题】(021)相交链表

答案用的哈希表是真没想到,很聪明,我都没想到可以用哈希表存储节点指针。想了半天最后用了最笨的方法……

s478527548的博客 254

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

力扣HOT 100-相交链表

【代码】力扣HOT 100-相交链表。

weixin_73214301的博客 170

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣Hot100--160.相交链表

解决办法:“把两条不同长度的链表拉成同样长”,从而保证两个指针最终同时到达相交节点(或同时到达 None)。—>“追及问题”思想。难点:正确处理链表不等长问题。

Lris_kk的博客 304

[力扣 Hot100]相交链表

也是一道往年考研题,先遍历两个链表求长度,然后用两个指针分别指向A和B的首个元素。对长的链表遍历,直到长链表待遍历节点数等于短链表长度,随后两个指针同步移动,直到二者同指。评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。

qq_53627591的博客 534

力扣HOT100(22)相交链表

最终两个指针一定会相遇:如果链表相交 相遇点就是第一个相交的节点。如果链表不相交,两个指针会同时走到NULL。当一个指针走到自己链表的末尾时,立即跳到另一个链表的头结点继续走。

m0_73857708的博客 75

LeetCode Hot 100 相交链表

请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。给你两个单链表的头节点。

2302_76776557的博客 1202

【leetcode hot 100 160】相交链表

【代码】【leetcode hot 100 160】相交链表。

longii11的博客 411

LeetCode Hot100 - 相交链表

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。

Deep_C的博客 1315

【力扣hot100】160.相交链表

给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点 c1 开始相交:题目数据整个链式结构中不存在环。,函数返回结果后,链表必须。输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3输出:Intersected at ‘8’

Jerryqjr的博客 1069

力扣Hot100 之160链表相交_8月18号

2.使用if 和while 循环时和C语言不一样的是,这里不需要使用花括号表示子部分内容,只需要使用缩进就可以,且每一个后面都要跟一个冒号。3.判断链表或者值是否为空时,直接 while n;循环来遍历链表并计算它的长度,而for循环是用来处理可迭代的对象,如元组,字典,字符串等元素。if(lenA>lenB):#B为长的链表。总结: 1. while循环和for循环的用法。

weixin_52933023的博客 282

力扣Hot100系列8(Java)——[链表]总结(上)(相交链表,反转链表,回文链表,环形链表,环形链表||,合并两个有序链表)

本文聚焦力扣 Hot100 中的六道链表经典题目,包括相交链表、反转链表、回文链表、环形链表、环形链表 II 及合并两个有序链表。文章结构清晰,每道题均依次呈现题目描述、核心代码、关键步骤解析及实例演示,重点拆解了双指针法、虚拟头节点、链表反转等核心技巧,深入阐释了环形链表入口查找等涉及的数学原理,帮助读者理解各题解题逻辑与边界处理要点,为链表类题目解题提供了系统的思路与参考。

2402_89049045的博客 1247

LeetCode hot100 -相交链表

然后从headB进行循环遍历链表B,遍历时用if进行判断,看链表B中的元素是否已经在哈希集合中。时间复杂度:O(m+n),其中 m 和 n 是分别是链表 headA 和 headB 的长度。当其中一个指针到达链表的尾部时,则令其等于另一个链表的头部,然后继续开始遍历,例如head1遍历到headA的尾部时,令head1=headB。需要遍历两个链表各一次。如果两个链表不相交时,最后两个指针一定会在链表的尾部相遇,即两个指针最后的值都为null。如果两个链表相交时,两个指针一定会在两个链表相交的节点相遇。

2503_90669258的博客 402
上一篇: LeetCode hot 100—环形链表 II
下一篇: LeetCode hot 100—两数相加
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值