【每天学习一点算法 2026/03/08】相交链表

每天学习一点算法 2026/03/08

题目:相交链表

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

  1. 我们可以先遍历一个链表将所有节点都存放在 Set 集合中,然后遍历另外一个链表遇到相同节点则表示这就是相交起始节点,如果没有相同节点则表示不存在相交节点。

    typescript 复制代码
    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     val: number
     *     next: ListNode | null
     *     constructor(val?: number, next?: ListNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.next = (next===undefined ? null : next)
     *     }
     * }
     */
    
    function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null {
      const set = new Set()
      while (headA) {
        set.add(headA)
        headA = headA.next
      }
      while (headB) {
        if (set.has(headB)) {
          return headB
        }
        headB = headB.next
      }
      return null
    };
  2. 双指针解法

    我们看图中这种情况,我们可以看出

    用一个指针遍历A链表,然后再遍历B链表,第二次到达相交节点的需要遍历的次数

    用一个指针遍历B链表,然后再遍历A链表,第二次到达相交节点的需要遍历的次数

    是相等的

    所以我们可以用两个指针分别遍历 A → B 和 B → A,两个指针节点第一次相遇的节点就是相交的起始节点,如果两个指针都遍历完了还没相遇那就没有相交节点。

    typescript 复制代码
    function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null {
      let tempA = headA
      let tempB = headB
      while (tempA != tempB) {
        tempA = tempA == null ? headB : tempA.next
        tempB = tempB == null ? headA : tempB.next
      }
      return tempA
    };

题目来源:力扣(LeetCode)

相关推荐
To_OC5 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495646 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
a1117769 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao9 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
爱刷碗的苏泓舒10 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
你想知道什么?11 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御11 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
AOwhisky12 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
烬羽12 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法