刷过最浪漫的一题,对的人终究会重逢:剑指 Offer 52. 两个链表的第一个公共节点(图+视频解析)

题目描述

题目链接

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

如下面的两个链表:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双指针法

首先判断两个链表是否有空链表,有的话就没有交点,直接返回null
如果两个链表都不是空,则定义两个指针,PA和PB,PA指向第一个链表头结点:headA,PB指向第二个链表的头结点:headB,只要PA和PB的指向不相同就一直循环执行,判断PA,PB是否指向为null,为空时指向另一个链表的头结点,不为空则继续向下执行;

如下面的图所示,假设headA和headB公共的部分长度为c,headA的自己独享的部分的长度为a,headB自己独享的部分的长度为b;
如果a=b,则PA和PB在走到a+1时必定相遇
如果a!=b, 则PA和PB会在走到a+b+c+1时相遇或者都指向彼此的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
};

原理如下图

  1. 如果a=b,则PA和PB在走到a+1时必定相遇

在这里插入图片描述
2.如果a!=b,则PA和PB会移动a+b+c这个距离之后再同时移动一次时相遇(如果两个链表有交集,则相交点就是两个链表的第一个公共节点;如果没有交集,则相交点就都是null :PA指向headB链表的空,PB指向headA链表的空)
在这里插入图片描述

3.如果没有交集的话,上图画红色框(值为2)的地方值为null

步骤如下图请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

方法二:哈希集合

先定义一个哈希集合,把第一个链表的每一个节点都存放在集合中,然后遍历第二个链表的每一个节点, 判断该节点是否在哈希集合中。

  • 如果不在继续向下遍历
  • 如果在返回该节点
  • 如果都不在,则这两个链表没有交集

代码

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

 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、信仰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值