当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)52.两个链表的第一个公共节点

题目描述

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

链表节点定义如下:

public class ListNode {
    int value;
    ListNode next;
}

测试用例

  • 功能测试(输入的两个链表有公共节点:第一个公共节点在链表的中间,第一个公共节点在链表的尾部,第一个公共节点是链表的头节点;输入的两个链表没有公共节点)
  • 特殊输入测试(输入的链表头节点是空指针)

题目考点

  • 考察应聘者对时间复杂度和空间复杂度的理解及分析能力。解决这道题有多种不同的思路。每当应聘者想到一种思路的时候,都要很快分析出这种思路的时间复杂度和空间复杂度各是多少,并找到可以优化的地方。
  • 考察应聘者对链表的编程能力。

用栈解题

对于上面那张图,我们会想到我们只要从链表的尾部开始遍历。那么最后一个相同的节点就是我们要找的节点。但是单向链表不能从尾开始遍历,所以我们要借助栈来实现从尾部遍历。

这种算法:时间复杂度为O(m+n),空间复杂度也是O(m+n)

参考解题

用栈解题

/**
 * 两个链表的第一个公共节点
 */
public class Solution {
    /**
     * 用栈解题
     * @param pHead1
     * @param pHead2
     * @return
     */
    public ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode commonNode = null;
        if (pHead1 == null || pHead2 == null) {
            return null;
        }
        // JDK建议双向队列Deque优先于Stack
        Deque<ListNode> stack1 = new ArrayDeque<>();
        Deque<ListNode> stack2 = new ArrayDeque<>();
        // 两个链表入栈
        while (pHead1 != null) {
            stack1.push(pHead1);
            pHead1 = pHead1.next;
        }
        while (pHead2 != null) {
            stack2.push(pHead2);
            pHead2 = pHead2.next;
        }
        // 不断出栈比较
        while (!stack1.isEmpty() && !stack2.isEmpty()) {
            if (stack1.peek() == stack2.peek()) {
                commonNode = stack1.peek();
            }
            stack1.pop();
            stack2.pop();
        }
        return commonNode;
    }
}

规律解题

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode A = headA, B = headB;
        while (A != B) {
            A = A != null ? A.next : headB;
            B = B != null ? B.next : headA;
        }
        return A;
    }
}
复杂度分析:
  • 时间复杂度 O(a + b) : 最差情况下(即 |a - b| = 1,c = 0 ),此时需遍历 a + b个节点。
  • 空间复杂度 O(1): 节点指针 A , B 使用常数大小的额外空间。

相关文章:

  • 剑指Offer系列(java版,详细解析)53.在排序数组中查找数字
  • 剑指Offer系列(java版,详细解析)54.二叉搜索树的第K大的节点
  • 剑指Offer系列(java版,详细解析)55.二叉树的深度
  • 剑指Offer系列(java版,详细解析)56.数字中数字出现的次数
  • 剑指Offer系列(java版,详细解析)57.和为s的数字
  • 剑指Offer系列(java版,详细解析)58.翻转字符串
  • 剑指Offer系列(java版,详细解析)59.队列的最大值
  • 剑指Offer系列(java版,详细解析)60.n个骰子的点数
  • 剑指Offer系列(java版,详细解析)61.扑克牌中的顺子
  • 剑指Offer系列(java版,详细解析)62.圆圈中最后剩下的数字
  • 剑指Offer系列(java版,详细解析)63.股票的最大利润
  • 剑指Offer系列(java版,详细解析)64.求1+2+...+n
  • 剑指Offer系列(java版,详细解析)65.不用加减乘除做加法
  • 剑指Offer系列(java版,详细解析)66.构建乘积数组
  • 剑指Offer系列(java版,详细解析)67.把字符串转化成整数
  • 【347天】每日项目总结系列085(2018.01.18)
  • 0基础学习移动端适配
  • 3.7、@ResponseBody 和 @RestController
  • docker容器内的网络抓包
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Python中eval与exec的使用及区别
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • windows下如何用phpstorm同步测试服务器
  • 好的网址,关于.net 4.0 ,vs 2010
  • 听说你叫Java(二)–Servlet请求
  • 微服务框架lagom
  • 我这样减少了26.5M Java内存!
  • 协程
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 用Python写一份独特的元宵节祝福
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​ubuntu下安装kvm虚拟机
  • ###项目技术发展史
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Java)【深基9.例1】选举学生会
  • (差分)胡桃爱原石
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十) 初识 Docker file
  • (四)c52学习之旅-流水LED灯
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 8.0 中有哪些新的变化?
  • .NET Framework与.NET Framework SDK有什么不同?
  • /3GB和/USERVA开关
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Builder用法
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @html.ActionLink的几种参数格式