Skip to main content

相交链表

Tips

题目类型: LinkedList, HashMap

题目

给你两个单链表的头节点 headA 和 headB, 请你找出并返回两个单链表相交的起始节点. 如果两个链表没有交点, 返回 null. 题目数据保证整个链式结构中不存在环. 注意, 函数返回结果后, 链表必须保持其原始结构.

示例

输入:

     a1 → a2 ↘
c1 → c2 → c3
b1 → b2 → b3 ↗

输出: c1

题解

假设链表 A 的长度为 a, 链表 B 的长度为 b, 相交部分(如果有的话)的长度为 c.

  • A 走过的路径长度为 a + (b - c)a (如果不相交)
  • B 走过的路径长度为 b + (a - c)b (如果不相交)

可以看到, 如果两个链表相交, 那么 A 和 B 一定会在相交节点相遇, 因为它们走过的总长度相同 a + b - c. 如果不相交, 它们最终都会变成 null.

/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/

/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function (headA, headB) {
let p = headA,
q = headB

while (p !== q) {
p = p === null ? headB : p.next
q = q === null ? headA : q.next
}

return p
}