力扣第160题-相交链表

186 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情

前言

力扣第160题 相交链表 如下所示:

image.png

image.png

一、思路

这一题的题目很长,简单翻译一下就是查找两个链表中相交的节点。为了找到 相交的节点,我们需要解决以下两个问题?

  • 如何判断链表是否相交?
  • 如果找到相交的节点?

判断两个链表是否相交非常简单,只需要判断两个链表中是否有元素相等。那如何找到相交的节点呢?

我们以题目中的示例一作为例子分析,两个链表如下所示:

image.png

我们发现既然要找到相交的节点,可以让两个链表从离相交地方相同距离的地方出发,如下图所示:

image.png

为了从相同距离的地方出发,我们可以让 从两链表的头出发,到头之后重新从另一链表出发

  1. 两链表同时从头出发

image.png

  1. A 链表遍历到头,B 链表还未到头

image.png

  1. A 重新从 B 出发

image.png

  1. B 遍历到头后

image.png

  1. AB 同距离出发

image.png

既然可以在相交点前同距离出发,那么找到相交节点也不是难事情了。

二、实现

实现代码

实现代码与示例中保持一致:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) return null;
    ListNode 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;
}

测试代码

public static void main(String[] args) {
    ListNode a1 = new ListNode(4);
    ListNode a2 = new ListNode(1);
    ListNode a3 = new ListNode(8);
    ListNode a4 = new ListNode(4);
    ListNode a5 = new ListNode(5);
    ListNode b1 = new ListNode(5);
    ListNode b2 = new ListNode(6);
    ListNode b3 = new ListNode(1);
    a1.next = a2;
    a2.next = a3;
    a3.next = a4;
    a4.next = a5;
    b1.next = b2;
    b2.next = b3;
    b3.next = a3;
    new Number160().getIntersectionNode(a1, b1);
}

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~