相交链表

遍历两个链表,保存在Map里,找到存在的就返回即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 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) {
const map = new WeakMap();
let curA = headA, curB=headB;
while(curA) {
map.set(curA, true);
curA = curA.next;
}
while(curB) {
if (map.has(curB)) {
return curB;
}
curB = curB.next;
}
return null;
};

优化时间复杂度O(m+n)空间复杂度O(1)
双指针
pA走完headA之后开始走headB
pB走完headB之后开始走headA

  • 如果存在相交
    假设相交长度为c,headA长度为(非相交长度a+c),headB长度为(非相交长度b+c)
    那么headA走完之后开始走headB,headB走完之后开始走headA
    在(a+b+c)的时候相遇,返回pA
  • 如果不相交
    假设headA长度为a,headB长度为b
    headA走完之后走headB
    headB走完之后走headA
    共同走了a+b之后,pA和pB会相同(同为null)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 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 pA = headA,
pB = headB;
while (pA !== pB) {
pA = pA ? pA.next : headB;
pB = pB ? pB.next : headA;
}
return pA;
};

本站由 ao 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。