面试题 02.07. 链表相交




方法一:哈希集合
var getIntersectionNode = function(headA, headB) {
const visited = new Set();
let temp = headA;
while (temp !== null) {
visited.add(temp);
temp = temp.next;
}
temp = headB;
while (temp !== null) {
if (visited.has(temp)) {
return temp;
}
temp = temp.next;
}
return null;
};
方法二:双指针
var getIntersectionNode = function(headA, headB) {
if (headA === null || headB === null) {
return null;
}
let pA = headA, pB = headB;
while (pA !== pB) {
pA = pA === null ? headB : pA.next;
pB = pB === null ? headA : pB.next;
}
return pA;
};
方法三:链表对齐
var getListLen = function (head) {
let len = 0, cur = head;
while (cur) {
len++;
cur = cur.next;
}
return len;
};
var getIntersectionNode = function(headA, headB) {
let curA = headA, curB = headB,
lenA = getListLen(headA),
lenB = getListLen(headB);
if (lenA < lenB) {
[curA, curB] = [curB, curA];
[lenA, lenB] = [lenB, lenA];
}
let i = lenA - lenB;
while (i-- > 0){
curA = curA.next;
}
while (curA && curA !== curB) {
curA = curA.next;
curB = curB.next;
}
return curA;
}