首页 > 编程语言 >【交叉链表】Java哈希表——HashSet类/双指针

【交叉链表】Java哈希表——HashSet类/双指针

时间:2023-12-13 13:46:24浏览次数:40  
标签:ListNode HashSet 链表 pA headB headA Java null

leetcode 160. 相交链表

题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1, 3e4]

题解1:
根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果发现某节点在HashSet存在则找到交叉节点。

时间复杂度:O(n + m)
空间复杂度:O(m)

HashSet实现代码
/**
 * 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) {
        Set<ListNode> set = new HashSet<>();
        while(headA != null) {
            set.add(headA);
            headA = headA.next;
        }
        while(headB != null) {
            if(set.contains(headB)) {
                return headB;
            }
            headB = headB.next;
        }
        return null;
    }
}

题解2:
维护链表A指针pA,链表B指针pB
这两个指针分别从链表头开始往后遍历,遍历到表尾后则指向另一个链表头继续遍历,直至找到交叉节点,或者两个指针同时再次遍历到表尾。
PS:当两个指针都指向另一个链表时,就表明,两个指针当前所在位置距离表尾的长度是一致的,通过这种方式可以消除两个链表长度不统一。

时间复杂度:O(m+n)
空间复杂度:O(1)

双指针实现代码
/**
 * 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 pA = headA, pB = headB;
        while(pA != null || pB != null) {
            if(pA == pB) return pA;
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return null;
    }
}

标签:ListNode,HashSet,链表,pA,headB,headA,Java,null
From: https://www.cnblogs.com/Eve7Xu/p/17898832.html

相关文章

  • Java零基础-枚举
    前言Java作为一门流行的编程语言,在各种领域都有广泛的应用。而在Java中,枚举是一种十分重要的数据类型。通过枚举,我们可以列出一组具有固定数量的值。摘要本文将介绍Java中的枚举类型,包括枚举类型的定义、使用方法,以及枚举类型在实际开发中的应用场景和优缺点分析。为了方便理解,......
  • 无涯教程-Java - 嵌套 if 语句函数
    nestedif-else嵌套语句这意味着您可以在另一个iforelseif语句中使用一个iforelseif语句。nestedif-语法if(Boolean_expression1){//当布尔表达式1为true时执行if(Boolean_expression2){//当布尔表达式2为true时执行}}nestedif-示例......
  • java面向对象
    面向对象类和对象:类(设计图):是对象共同特征的描述。对象:是真实存在的东西。在Java中必须先设计类,然后才能获得对象。类:publicclass类型{}创建对象:类名对象名=new类名();用来描述一类事物的类,专业叫做JavaBean类注意:类名首字母大写,需要见名知义,驼峰命名一个java......
  • JavaWeb文件上传和下载
    JavaWeb文件上传和下载(含文件上传重名覆盖解决方案)快速回忆,快就完了(哈哈)。我们这里借助的是:commons-fileupload-1.2.1.jarcommons-io.jar1文件上传1.1步骤0、前端页面的from表单设置enctype=“multipart/form-data”method=“post”<formaction="fileUpDown/FileUpServle......
  • java泛型
    一、概述 二、泛型类 示例:   三、泛型方法 示例:  四、泛型接口 示例:   五、类型通配符 示例: ......
  • 牛客Java题目练习
    Java用监视器机制实现了线程之间的同步执行。byteb=(byte)129的值是-127,因为byte的存储数字范围为[-128,127],在计算机中,数值用补码表示,相当于一个环,因此是-127。一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。错误,因为忽略......
  • 2023/12/10 链表
    #include<iostream>usingnamespacestd;typedefintElemType;//自定义链表数据元素为整数structLNode{ElemTypedata;LNode*next;};//初始化链表,返回值:失败返回nullptr,成功返回头结点地址LNode*InitList(){LNode*head=newLNode;//分配头结点......
  • JavaWeb教程
    JavaScriptJS是一门弱类型的语言,变量的数据类型由后面的赋值的类型决定。==是等于,做简单的字面值的比较;===是全等于,除了做字面值的比较外,还会比较两个变量的数据类型。vara="12";varb=12;a==b;//truea===b;//false在JavaScript中,所有的变量都可以作为一个布尔类型的......
  • Java核心技术卷一开发基础
    第一章Java程序设计概述JAVA语言的关键术语:简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释性、高性能、多线程和动态性。程序设计语言的成功更多地取决于其支持系统的能力,而不是语法的精巧性。第二章Java编程环境类库源代码在JDK中以压缩文件lib/......
  • HeadFirst Java-Kathy Sierra
    当某个对象被java虚拟机察觉不会被使用到,该对象就会被标记成可回收的。如果内存开始不足,垃圾收集器就会启动来清理垃圾、回收空间,让空间能够再次被利用。任何变量只要加上public、static和final,基本上都会变成全局变量取用的常数。事实上没有对象变量这样的东西存在,只要引用到......