【面试-leetcode160】相交链表(哈希表+双指针)

55 阅读2分钟

freysteinn-g-jonsson-s94zCnADcUs-unsplash.jpg 这是 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;
};

我的更多前端资讯

欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接