头图

牛客网高频算法题系列-BM10-两个链表的第一个公共结点

牛客网高频算法题系列-BM10-两个链表的第一个公共结点

题目描述

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

原题目见:BM10 两个链表的第一个公共结点

解法一:双重循环

使用双重循环遍历2个链表,简单粗暴,不过效率稍低。

解法二:双指针法

使用2个指针l1和l2分别从链表一和链表二的头结点遍历,遍历到尾部后,再分别从链表二和链表一遍历,如果两个链表有公共交点,则l1和l2一定会在交点处相遇,否则,l1和l2分别遍历完两个链表后都是null,没有公共结点。

代码

public class Bm010 {
    /**
     * 方法一:双重循环
     *
     * @param pHead1 链表一
     * @param pHead2 链表二
     * @return
     */
    public static ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if (pHead1 == null || pHead2 == null) {
            return null;
        }
        ListNode node1 = pHead1;
        // 外层循环遍历链表一的结点
        while (node1 != null) {
            ListNode node2 = pHead2;
            // 内层循环遍历链表二的结点
            while (node2 != null) {
                if (node2 == node1) {
                    return node1;
                }
                node2 = node2.next;
            }
            node1 = node1.next;
        }
        return null;
    }

    /**
     * 双指针法
     *
     * @param pHead1
     * @param pHead2
     * @return
     */
    public static ListNode findFirstCommonNode2(ListNode pHead1, ListNode pHead2) {
        // l1和l2分别从链表一和链表二的头结点遍历,遍历到尾部后,再分别从链表二和链表一遍历
        ListNode l1 = pHead1, l2 = pHead2;
        while (l1 != l2) {
            l1 = (l1 == null) ? pHead2 : l1.next;
            l2 = (l2 == null) ? pHead1 : l2.next;
        }
        // 如果两个链表有公共交点,则l1和l2一定会在交点处相遇,此时l1就是公共结点
        // 否则,l1和l2分别遍历完两个链表后都是null,没有公共结点,返回null
        return l1;
    }

    public static void main(String[] args) {
        ListNode pHead1 = ListNode.testCase2();
        System.out.println("链表一为");
        ListNode.print(pHead1);
        ListNode pHead2 = ListNode.testCase1();
        pHead2.next.next.next = pHead1.next.next;
        System.out.println("链表二为");
        ListNode.print(pHead2);

        ListNode.print(findFirstCommonNode(pHead1, pHead2));
        ListNode.print(findFirstCommonNode2(pHead1, pHead2));
    }
}
$1.01^{365} ≈ 37.7834343329$
$0.99^{365} ≈ 0.02551796445$
相信坚持的力量!

LeetCodet题解
技术学习

玉树临风,仙姿佚貌!

1.8k 声望
7.1k 粉丝
0 条评论
推荐阅读
牛客网高频算法题系列-BM19-寻找峰值
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于假设 nums[-1] = nums...

雄狮虎豹阅读 518

封面图
Java12的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft63阅读 11.9k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 24.7k评论 1

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go35阅读 2.6k评论 1

封面图
Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 15.5k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 20.5k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 14.6k

玉树临风,仙姿佚貌!

1.8k 声望
7.1k 粉丝
宣传栏