遍历两个链表,保存在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
|
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
|
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; };
|