当前位置: 首页 > news >正文

【链表】LC 160.相交链表

文章目录

  • 前言
  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、个人思路整理
    • 1、思路分析
      • 双指针解法
      • 非双指针解法(哈希表)
    • 2、解题代码
      • 双指针解法
      • 非双指针解法(哈希表)
  • 三、知识风暴

前言

本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。

一、题目

1、原题链接

160.相交链表

2、题目描述





二、个人思路整理

1、思路分析

双指针解法

这个解法有点妙,说实话理解不是很透彻,根据自己的理解梳理一下。

  1. 由于想要达到O(1)的空间复杂度,不能开辟额外空间;
  2. 本质上还是消除两个链表的长度差(由于链表在相交节点前走过的节点数是不同的,所以不能直接同时遍历来找相交的节点),从而达到一次遍历找到交点(当然也可以先计算链表的长度差,然后让长链表先走长度差距离,然后再一起向后走,第一个相同的节点即为交点);
  3. 我的理解是:如果要同时一次同时遍历就能找到交点,就必须把交点前的距离(经过的节点数补齐(补齐即可,不需要管补充的这段距离是否存在相交节点,如果确实存在,在后续遍历中由于补充的距离不同,所以不可能是在同时遍历中的第一个相同节点),这样一次同时遍历,当遇到的第一个相同节点即为相交节点);
  4. 本质上我认为是3这种理解。具体举例:
  • 如果链表A长度为a、链表B长度为b,相交的部分长度为c(可以把从A从B链表开始遍历的距离各想成一条直线,直线最后部分就是c,而直线前半部分存在不相等的情况需要补全)
  • 若要补全前面的长度差,就可以让链表A多走一个b距离,让链表B多走一个a距离,这样就相当于A走了a+b,而B走了b+a,由于只是补在前面,后面的共有部分没有变,所以当前面走完相同距离遇到的第一个相同的点即为交点。
  1. 所以,最终的解法:
    两链表同时遍历:
    A链表先遍历一遍A,若遍历完则继续遍历B;
    B链表先遍历一遍B,若遍历完则继续遍历A;
    当遍历遇到第一个相同节点即为交点。

下面为大模型给出的解释(参考防遗忘)

为什么这个方法有效?(数学原理解析)设:

  • 链表 A 独有的长度为a aa
  • 链表 B 独有的长度为b bb
  • 两链表公共(相交)部分的长度为c cc
    那么:
  • 链表 A 的总长度为a + c a + ca+c
  • 链表 B 的总长度为b + c b + cb+c

当指针 pA 走完 A 再走 B 时,到达交点的总路程是:a + c + b a + c + ba+c+b
当指针 pB 走完 B 再走 A 时,到达交点的总路程是:b + c + a b + c + ab+c+a
因为a + c + b = b + c + a a + c + b = b + c + aa+c+b=b+c+a,所以两个指针走过的总路程完全一致!这就消除掉了两条链表前段长度不一样的差值。

  • 如果不相交(即c = 0 c = 0c=0):pA 走了a + b a + ba+b步后变为 nullptr,pB 走了b + a b + ab+a步后也变为 nullptr,此时 pA == pB == nullptr,完美统一了逻辑。

非双指针解法(哈希表)

遍历链表A,将元素放置到哈希表中,然后从头节点开始依次遍历链表B,遍历到第一个的存在于哈希表中的节点,即为相交节点,否则不相交。

2、解题代码

双指针解法

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */classSolution{public:ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){ListNode*pa=headA;ListNode*pb=headB;// 当指向同一节点则结束while(pa!=pb){pa=(pa==nullptr)?headB:pa->next;//当遍历完A遍历Bpb=(pb==nullptr)?headA:pb->next;//当遍历完B遍历A}returnpa;}};

非双指针解法(哈希表)

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */classSolution{public:ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){unordered_set<ListNode*>s;ListNode*tmp=headA;while(tmp!=nullptr){s.insert(tmp);tmp=tmp->next;}tmp=headB;while(tmp!=nullptr){if(s.count(tmp)){returntmp;}tmp=tmp->next;}returnnullptr;}};

三、知识风暴

  • NULLnullptr
    • C++11及以上一律使用nullptr表示空指针(nullptr:C++11 引入的关键字,强类型字面量;实际类型为std::nullptr_t类型的常数);
    • 纯C语言或C++98以前才继续使用NULLNULL:宏定义,通常被定义为整数0(void*)0;实际类型为整型(int/long))
http://www.jsqmd.com/news/1311500/

相关文章:

  • 基于Python与开源模型构建智能语音处理系统:从转写到说话人分离与摘要
  • 2026 年新发布:巨野正规的直角方管制造厂家哪家强,工地用的那玩意儿,居然能让构件承重翻三倍还不占空间? - 企业信息推荐【官方】
  • Vue中Pinia和Vuex有什么区别该用哪个
  • 2026 年新消息:安远靠谱的单向止水闸门供货厂家综合实力解析,暴雨天能反向顶死洪水的这玩意儿,藏在小区地下车库不起眼角落 - 品质体验官
  • 2026年泸州公务员报考咨询机构怎么选?本地化考情服务成关键考量因素 - 优质品牌商家
  • 从《英雄联盟》神秘之剑看高风险高回报装备的设计与平衡
  • 南阳交通事故伤残鉴定难怎么办?2026年这5位律师专业推荐 - 本地品牌推荐
  • 大模型演进风向:超长上下文与智能体能力如何重塑AI应用开发
  • 2026 年更新:柳州正规的负离子藻钙板实力厂家怎么联系,刷墙选这货能让家多30%负氧离子?难怪邻居都在问链接-天顺高晶板 - 企业官方推荐【认证】
  • HDMI电子纸驱动板设计:从方案选型到Linux驱动开发全解析
  • 嵌入式SD卡存储模块设计:从SPI/SDIO接口到FATFS文件系统实战
  • 6款AI论文网站汇总
  • 华为模拟器添加卡片
  • NVIDIA VPI:统一异构计算后端,构建高性能边缘视觉处理流水线
  • 2026 年新发布:宁德靠谱的耐候钢花箱供应厂家哪家专业,小区角落不起眼的这玩意儿,居然能扛住十年风霜还能当装饰? - 企业推荐官【认证官方】
  • Grove录音模块工程化应用:从ISD1820P原理到抗干扰设计实战
  • 抗衰的尽头是胶原
  • 工业通信RS232转RS485(D)转换器:原理、设计与实战调试
  • 在石家庄做全屋定制,真没几个好品牌,这几个算的上头部品牌
  • DockDoor:让macOS窗口管理像翻书一样自然
  • 2026 年宁德比较好的白酒加盟供应厂家哪家权威,别再跟风折腾了!这事居然比你卖奶茶还稳,藏着多少人没敢说的赚钱门道? - 实业推荐官【官方】
  • 银河麒麟V10系统安装配置JDK全攻略:从OpenJDK到环境变量避坑
  • GPT-5.4原生操控电脑:从环境感知到自动化执行的AI桌面革命
  • 持久化执行前置课(七):崩溃恢复不是重跑,而是先判定已知与未知
  • AI FaultLab:给 Hybrid RAG 补上检索评测闭环
  • 基于Jetson Orin与ESP32的AI机器人开发:从硬件选型到视觉跟踪实战
  • 微客外链功能解析:抖音_快手私信跳转微信的实现原理与技术路径
  • 2026 年当下,天河可靠的膜结构汽车棚电动车棚选哪家优质厂家哪家可靠,别再瞎花钱装车棚了?这款实用型靠谱方案竟能省出半台车钱 - 鉴选官
  • MP4转MP3全平台实战指南:原理、工具与音质优化
  • 2026夏天选旅行社看这篇:西藏旅行社推荐与投诉率大比拼,我们对比了20家,这份避坑名单请收好| 附:旅行社电话 - 西藏康泰旅行社