两个链表的第一个公共节点使用JavaScript解决算法问题

93 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

有人相爱,有人夜里开车看海,我是LeetCode第一题都做不出来

两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。

如下面的两个链表

在节点 c1 开始相交。

示例 1:

160_example_1.png

输入: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3

输出: Reference of the node with value = 8

输入解释: 相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例 2:

输入: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1

输出: Reference of the node with value = 2

输入解释: 相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

解题思路

判断两个链表是否相交,可以使用哈希集合存储链表节点。遍历链表A,进行存储到哈希表内,然后再遍历B列表,判断该节点是否存在于此哈希表中

具体步骤如下:

  • 第一步:初始化一个set哈希集合,用于存储链表节点

  • 第二步:循环存储A链表节点

  • 第三步: 循环判断B链表的节点是否存在于集合内,如果存在则返回当前节点

  • 第四步:走到这就说明两个链表没有相交,所以返回null

var getIntersectionNode = function(headA, headB) {
    let set = new Set()
    let temp = headA
    while(temp){
        set.add(temp)
        temp = temp.next
    }
    temp = headB
    while(temp){
        if(set.has(temp)){
            return temp
        }
        temp = temp.next
    }
    return null
};

image.png