算法合集 | 链表 | Leetcode 面试题 02.07. 链表相交

73 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

前言

本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。

  • 今天来介绍一下如何判断链表相交

怎么判断链表相交

下面是一个正常的链表,里面有四个元素,最后指向null

图片.png

假设有另一个链表从结点3开始和它相交,如下图所示

图片.png

我们肉眼来看当然是很容易就能够看出来两个链表有相交的部分,但是放在代码当中,要怎么去判断两个链表是否相交,并且交点在哪个位置呢

我们可以从链表的后面开始往前判断,因为两个链表一但相交,那么后面的部分就一定是完全一样的,所以我们可以让两个链表尾部对齐,从短的链表的头结点开始往下遍历,一旦碰到两个链表对应的位置是一样的节点的时候,那么这里就是我们要找的相交点。

值得注意的是,题目中的相等是节点相等不是值相等,也就是两个节点当前所在的位置相等。

关于代表节点当前的位置,我们可以用双指针来表示,并且双指针就可以对比两个链表的长度,用来实现前面说的,将两个链表通过尾部对齐,由短的链表的头节点开始向下遍历去寻找相同节点。

图片.png

Leetcode 面试题 02.07. 链表相交

按照上面的思路来实现这道题,判断两个节点是否相等,直接用三等号就可以判断,并且一开始优先计算出两个链表的长度,这样既可以确定谁是短的链表,还是算出两个链表长度的差值,以此来决定指针要从哪里开始遍历。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNodeheadA
 * @param {ListNodeheadB
 * @return {ListNode}
 */
function getIntersectionNode(headA, headB) {
    let sizeA = 0;
    let sizeB = 0;
    let A = headA;
    let B = headB;
    while (A) {
        sizeA++;
        A = A.next;
    }
    while (B) {
        sizeB++;
        B = B.next;
    }
    A = headA;
    B = headB;
    if (sizeA < sizeB) 
        [sizeA, sizeB] = [sizeB, sizeA];
        [A, B] = [B, A];
    }
    let difference = sizeA - sizeB;
    while (difference-- && A) {
        A = A.next;
    }
    while (A && B) {
        if (A === B) {
            return A;
        }
        A = A.next;
        B = B.next;
    }
    return null;
};

图片.png