写点什么

【刷题第 14 天】两个链表的第一个公共节点

作者:白日梦
  • 2022 年 5 月 20 日
  • 本文字数:852 字

    阅读完需:约 3 分钟

一、题目描述:

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



在节点 c1 开始相交。

示例 1:



输入: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:

输入: s = "   fly me   to   the moon  "输出: 4 解释: 最后一个单词是“moon”,长度为4。复制代码
复制代码

二、思路分析:

哈希法

哈希大法好,遇到重复问题,应该会第一时间思考到使用哈希表。但哈希法实现比较简单,这里不多做赘述了。

双指针

我们要知道如果两个链表发生了重合,那么意味着从重合节点开始,两个链表后面的元素都是相同的。而且只有两个链表都不是空链表时,才会出现相交清空,因此我们首先判断一些是否存在空链表的特殊临界情况。

我们创建两个指针 pa pb 分别指向两个链表的头指针,然后依次遍历两个链表的节点:

那我们双指针会如何移动那?

  • 每次遍历都需要同步移动指针 pa 和 pb

  • 如果 pa 指针指向非空,则将 pa 指向下一个节点;如果 pb 指针指向非空,同样将 pb 指针指向下一个节点

  • 如果 pa 指向空,则将其指向至链表 B 的头节点;对 pa 同样处理

  • 当 pa 和 pb 指向同一元素或者都指向为空时,返回指向节点或者 null

三、AC 代码:

var getIntersectionNode = function(headA, headB) {    if (headA === null || headB === null) {        return null;    }    let pa = headA, pb = headB;    while (pa !== pb) {        if (pa === null) {            pa = headB;        }else {            pa = pa.next        }        if (pb === null) {            pb = headA;        }else {            pb = pb.next        }    }    return pa;};
复制代码
复制代码

四、总结:

做好双指针,走遍天下都不怕。最近刷题都没来得及总结,只能今夜连夜总结了。


发布于: 刚刚阅读数: 2
用户头像

白日梦

关注

还未添加个人签名 2022.03.10 加入

还未添加个人简介

评论

发布
暂无评论
【刷题第14天】两个链表的第一个公共节点_5月月更_白日梦_InfoQ写作社区