这是 leetcode 面试刷题一题多解系列的第13篇,给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。相交链表是一道比较经典的算法题目,我们可以通过哈希表或双指针法来解决。
题目
相交链表
来源:力扣(LeetCode)
链接:leetcode.cn/problems/in…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:哈希表
首先遍历链表A,将链表A的每个节点的地址都存储到哈希表中。然后遍历链表B,每次都去哈希表中查找当前节点是否在链表A中出现过,如果出现过,则当前节点就是两个链表相交的起始节点。
时间复杂度:O(m+n)
空间复杂度:O(m),其中 m 和 n 分别是两个链表的长度。
var getIntersectionNode = function(headA, headB) {
const map = new Map();
let node = headA;
while (node) {
map.set(node, true);
node = node.next;
}
node = headB;
while (node) {
if (map.has(node)) {
return node;
}
node = node.next;
}
return null;
};
解法二:双指针
我们可以分别遍历链表A和链表B,记录它们的长度。然后让长链表的指针先走n步(n为两个链表长度之差),然后让两个指针一起向前遍历,找到第一个相同的节点即可。
时间复杂度:O(m+n)
空间复杂度:O(1)
var getIntersectionNode = function(headA, headB) {
let lenA = getLength(headA);
let lenB = getLength(headB);
let nodeA = headA;
let nodeB = headB;
if (lenA > lenB) {
for (let i = 0; i < lenA - lenB; i++) {
nodeA = nodeA.next;
}
} else {
for (let i = 0; i < lenB - lenA; i++) {
nodeB = nodeB.next;
}
}
while (nodeA && nodeB) {
if (nodeA === nodeB) {
return nodeA;
}
nodeA = nodeA.next;
nodeB = nodeB.next;
}
return null;
};
var getLength = function(head) {
let len = 0;
let node = head;
while (node) {
len++;
node = node.next;
}
return len;
};
我的更多前端资讯
欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接