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

题目描述

题目链接

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

如下面的两个链表:

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

双指针法

首先判断两个链表是否有空链表,有的话就没有交点,直接返回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节点

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

代码

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时必定相遇

刷过最浪漫的一题,对的人终究会重逢:剑指 Offer 52. 两个链表的第一个公共节点(图+视频解析)_第6张图片
2.如果a!=b,则PA和PB会移动a+b+c这个距离之后再同时移动一次时相遇(如果两个链表有交集,则相交点就是两个链表的第一个公共节点;如果没有交集,则相交点就都是null :PA指向headB链表的空,PB指向headA链表的空)
刷过最浪漫的一题,对的人终究会重逢:剑指 Offer 52. 两个链表的第一个公共节点(图+视频解析)_第7张图片

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

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

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

方法二:哈希集合

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

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

代码

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;
};

 

你可能感兴趣的:(Leetcode,/,算法题,链表,数据结构)