我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java 相交链表的实现示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 相交链表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java 相交链表的实现示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java如何实现相交链表

这篇文章主要为大家展示了“java如何实现相交链表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现相交链表”这篇文章吧。1.题目相交链表:给你两个单链表的头节点 headA 和 h
2023-06-25

链表原理及java实现的示例分析

这篇文章主要介绍了链表原理及java实现的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:单向链表基本介绍链表是一种数据结构,和数组同级。比如,Java中我们使用的
2023-05-30

Golang实现单链表的示例代码

本文主要介绍了Golang实现单链表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-15

Java中链表的示例分析

这篇文章将为大家详细讲解有关Java中链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题目一 解法/** * Definition for singly-linked list. * publ
2023-06-29

Java复杂链表的示例分析

这篇文章将为大家详细讲解有关Java复杂链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个
2023-06-28

Python实现的单向循环链表功能示例

本文实例讲述了Python实现的单向循环链表功能。分享给大家供大家参考,具体如下: 概述: 单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空。由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头。
2022-06-04

Java之单链表问题的示例分析

这篇文章给大家分享的是有关Java之单链表问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。单链表单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表
2023-06-20

Java数据结构之链表的示例分析

小编给大家分享一下Java数据结构之链表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、链表的介绍什么是链表链表是一种物理存储单元上非连续、非顺序的存
2023-06-15

Java 链表的定义与简单实例

Java 链表的定义与简单实例Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同对象的的相同方法的方法内调用算不算递归.这里我写的是单向链表;package com.example
2023-05-31

C++实现带头双向循环链表的示例详解

这篇文章主要介绍了如何利用C++实现带头双向循环链表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-12-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录