Skip to main content

相交链表

Tips

题目类型: LinkedList, HashMap

题目

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

示例

输入:

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

输出: c1

题解

基本的原理就是当一条链表走到头了, 就把它换成另一条从头开始. 这样的目的是保证在两条链表置换后, 指针可以齐头并进, 比如示例中, 当两条链条都变化后, 一个指针就会在 a1, 另一个指针在 b2 上, 那这两个指针齐头并进. 就能找到交点.

/**
* 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
}