leetcode 链表相交

2023-10-30

面试题 02.07. 链表相交 - 力扣(LeetCode) (leetcode-cn.com)

在看别人的题解之前我有过两个思路。

1.最容易想到的就是对链表A中的每个元素都在B中查找,如果找到了就是相交点,显然这种方法的时间复杂度比较高,leetcode执行用时是709ms。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA==null||headB==null)
            return null;
        ListNode Anode = headA;
        ListNode Bnode = null;
        while (Anode!=null){
            Bnode = headB;
            while (Bnode!=null){
                if(Anode==Bnode)
                    return Anode;
                Bnode = Bnode.next;
            }
            Anode = Anode.next;
        }

        return null;
    }
}

2.第一种的时间太长了,我就想改进一下,想到了用Set记录遍历过的结点,如果某一次add(node)之后Set.size()没有变,就说明这个node就是相交点。leetcode执行时间13ms.

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA==null||headB==null)
            return null;
        ListNode Anode = headA;
        ListNode Bnode = headB;

        Set<ListNode> set = new HashSet<>();
        int size = 0;

        while (Anode!=null&&Bnode!=null){
            size = set.size();
            set.add(Anode);
            if (size == set.size())
                return Anode;
            size = set.size();
            set.add(Bnode);
            if(size == set.size())
                return Bnode;

            Anode = Anode.next;
            Bnode = Bnode.next;
        }

        if (Anode==null&&Bnode!=null){
            while (Bnode !=null){
                size = set.size();
                set.add(Bnode);
                if(size == set.size())
                    return Bnode;
                Bnode = Bnode.next;
            }
        }
        if (Bnode==null&&Anode!=null){
            while (Anode !=null){
                size = set.size();
                set.add(Anode);
                if(size == set.size())
                    return Anode;
                Anode = Anode.next;
            }
        }

        return null;
    }
}

3.看了别人的题解,有一种更好的方法:假设链表A和B的长度分别是n,m(n>m),就让链表A先走(n-m)步,此时A和B就是一种“并驾齐驱”的状态,之后A,B一起向后遍历,遇到的第一个相同的结点就是相交点。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lenA = 0;
        int lenB = 0;
        ListNode Anode = headA;
        ListNode Bnode = headB;
        while (Anode != null) {
            lenA++;
            Anode = Anode.next;
        }
        while (Bnode != null) {
            lenB++;
            Bnode = Bnode.next;
        }
        int diff;
        if (lenA < lenB) {
            diff = lenB - lenA;
            ListNode temp = headA;
            headA = headB;
            headB = temp;
        } else {
            diff = lenA - lenB;
        }
        while (diff-- != 0) {
            headA = headA.next;
        }
        while (headA != null && headB != null) {
            if (headA == headB)
                return headA;
            headA = headA.next;
            headB = headB.next;
        }
        return null;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 链表相交 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 产品经理针对用户访谈获得的信息该如何理解吸收

    核心 他人的负反馈 吐槽 要认可 他人的正反馈 认可 要谨慎 以产品规划阶段为例 我们打算做一个产品 为了论证市场价值 我们会找相关的客用户开展用户访谈 根据事先准备的访谈大纲开展访谈 收集信息很容易 如何筛选 分析信息 这才是难点和关键
  • UE4数据写入Json格式

    用UE4写入Json很简单只需要使用 TSharedPtr
  • 散列(哈希)表

    1 如何构造散列函数 总结三点散列函数设计的基本要求 1 散列函数计算得到的散列值是一个非负整数 下标从0开始 2 如果key1 key2 那么hash key1 hash key2 相同的key经过hash 得到的散列值应该是相等的 3
  • 力扣刷题记录 -- JAVA---137--84. 柱状图中最大的矩形

    目录 一 题目 二 代码 三 运行结果 一 题目 二 代码 class Solution 类比贪心 局部最优到全局最优 左边第一个小于的下标 右边第一个小于的下标 public int largestRectangleArea int he
  • LeetCode-321.拼接最大数、单调栈

    给定长度分别为 m 和 n 的两个数组 其元素由 0 9 构成 表示两个自然数各位上的数字 现在从这两个数组中选出 k k lt m n 个数字拼接成一个新的数 要求从同一个数组中取出的数字保持其在原数组中的相对顺序 求满足该条件的最大数
  • Ubuntu系统查看镜像源并使用阿里云的镜像源

    Ubuntu系统查看镜像源并使用阿里云的镜像源 前言 查看系统镜像源 修改系统镜像源 测试与更新 前言 Ubuntu 使用 apt 管理系统级的包 软件非常方便 但由于这些托管包 软件的中央仓库基本都位于美国 所以对于国内用户来说因为洲际网
  • Windows powershell 正确初始化anaconda

    我安装的conda为miniconda 安装在E miniconda下 首先 在powershell中输入 powershell ExecutionPolicy ByPass NoExit Command E miniconda shell
  • springBoot输出日志到指定目录

    以输出日志文件到D data log为例 版本一 一 在application properties加上如下配置 logging path D data log logging config classpath logback spring
  • Vue自定义指令

    目录 1 自定义指令注册 1 1 全局注册 1 2 局部注册 2 自定义指令写法 2 1 对象式 常用 2 2 函数式 3 总结 1 自定义指令注册 1 1 全局注册 Vue directive name 1 2 局部注册 directiv
  • 计算机怎么更改桌面图标大小,win7系统桌面图标怎么设置大小 win7电脑桌面图标大小更改方法...

    win7系统在使用的时候不知道大家有没有遇上这样的问题 就是桌面图标的大小不符合我们的审美 那么遇上这种情况要怎么解决呢 下面小编就跟大家说说处理的方法 具体的解决方法 这种方法是最快捷的方法 我们可以在电脑桌面上 按住Ctrl键不放 然后
  • Qt 子线程中使用UI线程

    方案起源 最近做了一个Excel保存图表的项目 因为不能直接用Excel的图表 会直接暴露计算数据 所以采用的是QCharts生成的表格 但是QCharts的问题是 调用QChartView setChart接口之后 会出现不在同一个线程的
  • 模拟电路设计(5)--- J-FET的特性曲线

    上篇我们分析了J FET的结构和工作原理 今天我们来说说J FET的输出 转移特性曲线 J FET的输出特性曲线 由图中可以看出 J FET的输出特性曲线分为四个区域 可变电阻区 线性放大区 截止区和击穿区 下面分别来说说 1 截止区 在N
  • Vue第10天笔记:Vue动画(了解)、yarn命令的安装、webpack:介绍、基本步骤使用、npm中 --save和 --save-dev的区别、scripts的使用、配置到文件中、自动生成插件

    前一天复习 1 自定义指令 1 定义使用 Vue directive 指令名 指令的配置对象 2 五个钩子函数 bind inserted update 3 钩子函数的参数 el 指令所在的元素 binding 指令相关的信息对象 1 na
  • 【数模】奇异值分解SVD和图形处理

    介绍奇异值分解在图形压缩中的运用 并将简单介绍下Matlab对于图形和视频的处理 一 奇异值分解介绍 1 1 基本概念 奇异值分解 Singular Value Decomposition 以下简称SVD 是线性代数中一种重要的矩阵分解 U
  • C++ STL三大常用容器

    看到一篇文章觉得对不熟悉STL容器特性和使用选择的人来说很友好 就收藏和学习下 https blog csdn net qq 44943840 article details 121990808 C 中的容器可以分为好多种 常见的有顺序容器
  • 计算机网络(一)----概述

    概述 功能 组成 分类 性能指标 一 计算机网络的概述 1 网络的概念网络是由若干结点和链路组成 结点可以是计算机 集线器 交换机 路由器等 链路可以是有线链路或无线链路 如电信网络 电话 电报 传真服务 有限电视网络 观看电视节目 计算机
  • C++矩阵运算类(Matrix.h)

    这个类数据类型是double 包含了常用的矩阵计算 多数方法经过实践验证 也难免有不足之处 如有发现欢迎指出 https github com ims0 comTutor tree master matrix include
  • 晶振的负载电容与外接电容的区别与关系

    经常遇到有人把晶振的负载电容与外接电容混淆 甚至还有人误以为这是指同样的参数 这里需要特别指出的是 若你这样想 就大错特错了 下面就为您进行分析与区分 负载电容指的是晶振的一个内部重要电气参数 一般情况下 对功耗不太敏感的电子设备PCBA上
  • Stable Diffusion模型阅读笔记

    Stable Diffusion模型 什么是Stable Diffusion模型 一般而言 扩散是在图像中反复添加小且随机的噪声 与之相反 Stable Diffusion模型是一种将噪声生成为图像的机器学习模型 经过训练 它可逐步对随机高
  • leetcode 链表相交

    面试题 02 07 链表相交 力扣 LeetCode leetcode cn com 在看别人的题解之前我有过两个思路 1 最容易想到的就是对链表A中的每个元素都在B中查找 如果找到了就是相交点 显然这种方法的时间复杂度比较高 leetco