【每天学习一点算法 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)

相关推荐
一碗白开水一2 小时前
【工具相关】OpenClaw 配置使用飞书:打造智能飞书助手全流程指南(亲测有效,放心享用)
人工智能·深度学习·算法·飞书
仰泳的熊猫3 小时前
题目2194:蓝桥杯2018年第九届真题-递增三元组
数据结构·c++·算法
Tisfy3 小时前
LeetCode 1888.使二进制字符串字符交替的最少反转次数:前缀和O(1)
算法·leetcode·字符串·题解
滴滴答滴答答4 小时前
机考刷题之 9 LeetCode 503 下一个更大元素 II
算法·leetcode·职场和发展
飞Link4 小时前
梯度下降的优化算法中,动量算法和指数加权平均的区别对比
人工智能·深度学习·算法
red_redemption4 小时前
自由学习记录(130)
学习·soa·aos·ecs已成核心包·shading!=ps
啊哦呃咦唔鱼4 小时前
LeetCode hot100-15 三数之和
数据结构·算法·leetcode
_日拱一卒4 小时前
LeetCode(力扣):杨辉三角||
算法·leetcode·职场和发展
双叶8364 小时前
(Python)Python爬虫入门教程:从零开始学习网页抓取(爬虫教学)(Python教学)
后端·爬虫·python·学习