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

57 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

image.png

在节点 c1 开始相交。

示例 1:

image.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:

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

四、总结:

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