链表相交

28 阅读1分钟

链表相交

力扣题目链接(opens new window)

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

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

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

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

示例 1:

示例 2:

示例 3:

解法

对于两个相交链表,可以先将相交链表拆开为两个链表,标出相同部分。如下图所示:

截屏2025-09-03 15.07.04.png

在上图基础上,可以划两条线,将链表分为三部分。

  • 相同部分
  • 长度超出部分
  • 长度相同但元素不同部分

如下图L:

截屏2025-09-03 15.11.06.png

所以解题思路就是,先去除长度超出部分,再去除长度相同但元素不同部分。

  1. 求出两个链表的长度
  2. 长度相减得到长度差
  3. 长度较长的链表从链表头开始走长度差步
  4. 两个链表同时向后走,直到相等或为空
  5. 返回相等节点

代码

var getIntersectionNode = function(headA, headB) {
    if(headA === null || headB === null) {
        return null
    }
    let nodeA = headA
    let nodeB = headB
    let lenA = 1
    let lenB = 1

    while(nodeA !== null) {
        nodeA = nodeA.next
        lenA++
    }

    while(nodeB !== null) {
        nodeB = nodeB.next
        lenB++
    }

    let difference = Math.abs(lenA - lenB)

    nodeA = headA
    nodeB = headB

    if(lenA > lenB) {
        while(difference > 0) {
            nodeA = nodeA.next
            difference--
        }
    } else {
        while(difference > 0) {
            nodeB = nodeB.next
            difference--
        }
    }

    while(nodeA && nodeB && nodeA !== nodeB) {
        nodeA = nodeA.next
        nodeB = nodeB.next
    }

    if(nodeA === nodeB) {
        return nodeA
    } else {
        return null
    }
};