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

剑指offer48_两个链表的第一个公共节点

两个链表的第一个公共节点


输入两个链表,找出它们的第一个公共结点。

当不存在公共节点时,返回空节点。

数据范围

链表长度 [ 1 , 30000 ] [1,30000] [1,30000]
保证两个链表不完全相同,即两链表的头结点不相同。

样例
给出两个链表如下所示:
A:        a1 → a2↘c1 → c2 → c3↗            
B:     b1 → b2 → b3输出第一个公共节点c1

算法思路(双指针 + 路径交换)
  1. 核心思想
    • 使用两个指针 pq 分别遍历链表 AB
    • 当任一指针到达链表末尾时,将其重定向到另一链表的头节点。
    • 若两链表有公共节点,pq 会在第二次遍历时相遇;若无公共节点,最终会同时到达 NULL
  2. 关键操作
    • 路径交换p 遍历完 A 后转向 Bq 遍历完 B 后转向 A,抵消两链表的长度差。
    • 终止条件p == q 时返回当前节点(公共节点或 NULL)。
  3. 正确性证明
    • 无公共节点:两指针最终同时指向 NULLpq 均遍历 m + n 次)。
    • 有公共节点
      • A 独有部分长度为 aB 独有部分为 b,公共部分为 c
      • p 的路径:a + c + bq 的路径:b + c + a,路径长度相同,必在公共节点相遇。
维度说明公式
时间复杂度两指针最多遍历 m + n 个节点(mn 为两链表长度)。 O ( m + n ) O(m + n) O(m+n)
空间复杂度仅使用两个指针,无额外空间。 O ( 1 ) O(1) O(1)

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {auto p = headA, q = headB;  // 初始化双指针while (p != q) {             // 未相遇时继续遍历p = p ? p->next : headB; // p走到尽头后转向headBq = q ? q->next : headA; // q走到尽头后转向headA}return p;  // 返回公共节点或NULL}
};
示例演示

链表结构

  • A: 1 → 2 → 3 ↘
  • B: 4 → 5 ↗
  • 公共部分:6 → 7

指针路径

  1. p: 1 → 2 → 3 → 6 → 7
  2. q: 4 → 5 → 6 → 7
    相遇点:节点 6(第一个公共节点)

**变种与扩展 **
  1. 哈希表法
    • 遍历链表 A 并存储节点到哈希表,再遍历 B 检查是否存在。
    • 时间复杂度: O ( m + n ) O(m + n) O(m+n),空间复杂度: O ( m ) O(m) O(m) O ( n ) O(n) O(n)
  2. 长度差法
    • 先计算两链表长度差 d,长链表指针先走 d 步,再同步遍历。
    • 时间复杂度: O ( m + n ) O(m + n) O(m+n),空间复杂度: O ( 1 ) O(1) O(1)
  3. 环形链表检测
    • 若允许修改链表,可将 B 的尾节点指向 A 的头,转化为环形链表入口问题(需恢复原结构)。
http://www.lryc.cn/news/576452.html

相关文章:

  • 叉车考试真题(含答案)pdf下载
  • 告别脚本!用浏览器为 AWS CLI 实现真正的 Cognito 单点登录
  • 案例开发 - 日程管理系统 - 第一期
  • PostgreSQL对比Mysql
  • WPS之PPT镂空效果实现
  • Lua现学现卖
  • 数据湖 vs 数据仓库:数据界的“自来水厂”与“瓶装水厂”?
  • 如何利用好doctor
  • lambda、function基础/响应式编程基础
  • JSON简介及其应用
  • 【世纪龙科技】新能源汽车动力电池总成装调与检修教学软件
  • Python助力自动驾驶:深度学习模型优化全攻略
  • JavaScript中Object()的解析与应用
  • InfluxDB 3 Core最后值缓存深度实践:毫秒级响应实时数据的核心引擎
  • Linux 内存调优之 BPF 分析用户态小内存分配
  • scGPT-spatial 复现
  • 创建套接字时和填充地址时指定类型的异同
  • 测试用例设计方法汇总
  • Spring Cloud 微服务(负载均衡策略深度解析)
  • 【力扣 简单 C】121. 买卖股票的最佳时机
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(二)- 职位数据清洗与预处理
  • centos指令
  • Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327)
  • 买卖股票的最佳时机 II
  • Python 数据分析:numpy,抽提,整数数组索引
  • AtCoder AT_abc412_c [ABC412C] Giant Domino 题解
  • 《Go语言高级编程》玩转RPC
  • 《HarmonyOSNext应用防崩指南:30秒定位JS Crash的破案手册》
  • vue-28(服务器端渲染(SSR)简介及其优势)
  • 机器学习配置环境