java 相交链表的实现示例

 更新时间:2021年11月08日 09:14:59   作者:宗旨飞翔  
本文主要介绍了java 相交链表的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.题目

相交链表:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。相交链表

2.分析

相交链表是Y字型next域相同。
定义两个引用pl和ps

在这里插入图片描述

如果每个链表相交结点前长度相同,一步一步走,直到相同就找到了相交结点。如果长度不一样,首先要长链表先走差值步,然后再一人走一步直到相遇

长度不同:

在这里插入图片描述

在这里插入图片描述

长度相同:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

首先求长度,先假设pl指向headA:

 ListNode pl = headA;
        ListNode ps = headB;

        int lenA = 0;
        int lenB = 0;
        while (pl != null) {
            lenA++;
            pl = pl.next;
        }
        //pl==null;
        pl = headA;

        while (ps != null) {
            lenB++;
            ps = ps.next;
        }
        //ps==null;
        ps = headB;

然后根据长度差值的正负判断谁长,将pl指向长的链表:

int len = lenA - lenB;//差值步
        if (len < 0) {
            pl = headB;
            ps = headA;
            len = lenB - lenA;
        }

然后长的先走长度差值步,最后一人一步走:

 //pl走差值len步
        while (len != 0) {
            pl = pl.next;
            len--;
        }
        //同时走,直到相遇
        while (pl != ps) {
            pl = pl.next;
            ps = ps.next;
        }
        return pl;
        }

3.完整代码

//判断链表相交
    public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }

        ListNode pl = headA;
        ListNode ps = headB;

        int lenA = 0;
        int lenB = 0;
        while (pl != null) {
            lenA++;
            pl = pl.next;
        }
        //pl==null;
        pl = headA;

        while (ps != null) {
            lenB++;
            ps = ps.next;
        }
        //ps==null;
        ps = headB;

        int len = lenA - lenB;//差值步
        if (len < 0) {
            pl = headB;
            ps = headA;
            len = lenB - lenA;
        }
        //1、pl永远指向最长的链表  ps永远指向最短的链表   2、求到了差值len步

        //pl走差值len步
        while (len != 0) {
            pl = pl.next;
            len--;
        }
        //同时走,直到相遇
        while (pl != ps) {
            pl = pl.next;
            ps = ps.next;
        }
        return pl;
    }

测试:

 public static void main(String[] args) {
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.addLast(12);
        myLinkedList.addLast(23);
        myLinkedList.addLast(34);
        myLinkedList.addLast(45);
        System.out.println("myLinkedList:");
        myLinkedList.display();

        MyLinkedList myLinkedList1 = new MyLinkedList();
        myLinkedList1.addLast(13);
        myLinkedList1.addLast(22);
        myLinkedList1.addLast(30);
        System.out.println("myLinkedList1:");
        myLinkedList1.display();
        createCut(myLinkedList.head, myLinkedList1.head);
        try {
            ListNode ret = getIntersectionNode(myLinkedList.head, myLinkedList1.head);
            myLinkedList.display2(ret);
        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("没有相交结点!");
        }

    }

在这里插入图片描述

MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.addLast(12);
        myLinkedList.addLast(23);
        myLinkedList.addLast(34);
        myLinkedList.addLast(56);
        System.out.println("myLinkedList:");
        myLinkedList.display();

        MyLinkedList myLinkedList1 = new MyLinkedList();
        myLinkedList1.addLast(12);
        myLinkedList1.addLast(23);
        myLinkedList1.addLast(30);
        System.out.println("myLinkedList1:");
        myLinkedList1.display();
        //createCut(myLinkedList.head,myLinkedList1.head);
        try {
            ListNode ret = getIntersectionNode(myLinkedList.head, myLinkedList1.head);
            System.out.println(ret.val);
        }catch (NullPointerException e){
            e.printStackTrace();
            System.out.println("不存在相交结点!");
        }

    }

在这里插入图片描述

到此这篇关于java 相交链表的实现示例的文章就介绍到这了,更多相关java 相交链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JPA CriteriaBuilder子查询方式

    JPA CriteriaBuilder子查询方式

    这篇文章主要介绍了JPA CriteriaBuilder子查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • mybatis教程之resultmap_动力节点Java学院整理

    mybatis教程之resultmap_动力节点Java学院整理

    这篇文章主要介绍了mybatis教程之resultmap,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • springboot整合mybatis将sql打印到日志的实例详解

    springboot整合mybatis将sql打印到日志的实例详解

    这篇文章主要介绍了springboot整合mybatis将sql打印到日志的实例详解,需要的朋友可以参考下
    2017-12-12
  • Java 动态模拟操作系统进程调度算法

    Java 动态模拟操作系统进程调度算法

    这篇文章主要介绍了采用java语言编程模拟N个进程采用动态高优先权优先进程调度算法。文中代码具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2021-12-12
  • SpringBoot使用Redisson实现分布式锁(秒杀系统)

    SpringBoot使用Redisson实现分布式锁(秒杀系统)

    这篇文章主要为大家详细介绍了SpringBoot使用Redisson实现分布式锁,秒杀系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java代码如何判断linux系统windows系统

    Java代码如何判断linux系统windows系统

    这篇文章主要介绍了Java代码如何判断linux系统windows系统问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java中如何避免sql注入实例详解

    Java中如何避免sql注入实例详解

    SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面这篇文章主要给大家介绍了关于Java中如何避免sql注入的相关资料,需要的朋友可以参考下
    2022-01-01
  • 浅谈SpringMVC中的session用法及细节记录

    浅谈SpringMVC中的session用法及细节记录

    下面小编就为大家带来一篇浅谈SpringMVC中的session用法及细节记录。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot详细讲解通过自定义classloader加密保护class文件

    SpringBoot详细讲解通过自定义classloader加密保护class文件

    这篇文章主要介绍了SpringBoot通过自定义classloader加密class文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Java Agent (代理)探针技术详情

    Java Agent (代理)探针技术详情

    这篇文章主要介绍了Java Agent 探针技术详情,Java 中的 Agent 技术可以让我们无侵入性的去进行代理,最常用于程序调试、热部署、性能诊断分析等场景,下文更多相关资料,感兴趣的小伙伴可以参考一下
    2022-04-04

最新评论