无序链表的归并排序 - Java代码纯享版

2023-11-02

public class ListNodeMergeSort {

    public static class ListNode{
        int val;
        ListNode next;
        public ListNode(int val){
            this.val = val;
        }
        public ListNode(){}

        public void setVal(int x){
            this.val = x;
        }

        public int getVal(){
            return this.val;
        }
    }

    public ListNode merge(ListNode list1, ListNode list2){
        ListNode dummyList = new ListNode(-1);

        // 临时变量
        ListNode tmp = dummyList;
        ListNode tmp1 = list1;
        ListNode tmp2 = list2;

        // 开始有序合并
        while (tmp1!=null && tmp2!=null){
            if(tmp1.val<tmp2.val){
                tmp.next = tmp1;
                tmp1 = tmp1.next;
            }else{
                tmp.next = tmp2;
                tmp2 = tmp2.next;
            }
            tmp = tmp.next;
        }

        // 剩余链表合并
        if (tmp1!=null){
            tmp.next = tmp1;
        }else if(tmp2!=null){
            tmp.next = tmp2;
        }

        return dummyList.next;
    }

    public ListNode sortList(ListNode head, ListNode tail){
        // 节点为空
        if(head == null){
            return head;
        }

        // 只有一个节点
        if(head.next == tail){
            head.next = null;
            return head;
        }

        // 开始找到中点
        ListNode fast = head;
        ListNode slow = head;
        while (fast!=tail){
            fast = fast.next;
            slow = slow.next;
            if(fast!=null){
                fast = fast.next;
            }
        }

        // 划分为head->mid-1 mid->tail
        ListNode mid = slow;
        ListNode list1 = sortList(head,mid);    //mid为下一个链表的开始
        ListNode list2 = sortList(mid, tail);
        ListNode sorted = merge(list1, list2);  //合并两个有序的链表
        return sorted;
    }

    public ListNode sortList(ListNode head){
        return sortList(head, null);
    }

    public static void main(String[] args) {
        ListNode head = new ListNode(5);
        ListNode cur = head;
        for(int i=5;i>=0;i--){
            cur.next = new ListNode(i);
            cur = cur.next;
        }

        // 排序之前
        ListNode tmp = head;
        System.out.println("排序之前");
        while (tmp!=null){
            System.out.printf(tmp.val+ " ");
            tmp = tmp.next;
        }
        System.out.println();

        // 排序之后
        ListNodeMergeSort listNodeMergeSort = new ListNodeMergeSort();
        head = listNodeMergeSort.sortList(head);
        tmp = head;
        System.out.println("排序之后");
        while (tmp!=null){
            System.out.printf(tmp.val+ " ");
            tmp = tmp.next;
        }
        System.out.println();
    }

}

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

无序链表的归并排序 - Java代码纯享版 的相关文章

随机推荐

  • 【2021-03-20】【Mybatis】Mybatis 判断字符串非空和空串 报错, Encountered “ <IDENT> “AND ““ at line 1

    Mybatis Mybatis 判断字符串非空和空串 报错 Encountered AND at line 1 1 Mybatis xml 代码 2 console 控制台报错 org mybatis spring MyBatisSyste
  • 5G技术详解:带AMF重选的注册流程(Step 5a-7a)

    相关文章会在公众号同步更新 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避免通过二手 甚至多手的资料 以讹传讹误导网友 在介绍完流程详解后 会整理专题内容 比如切片 服务发现 QoS流端到端
  • 使用smtplib库隐藏授权码发送邮件

    效果图 代码如下 进行邮箱连接的库 import smtplib 处理邮件内容的库 from email mime text import MIMEText import keyring 获取授权码 pwd keyring get pass
  • Spring注入Bean的七种方式

    通过注解注入Bean 背景 我们谈到Spring的时候一定会提到IOC容器 DI依赖注入 Spring通过将一个个类标注为Bean的方法注入到IOC容器中 达到了控制反转的效果 那么我们刚开始接触Bean的时候 一定是使用xml文件 一个一
  • Kafka基本安装和启动

    Kafka基本安装和启动 一 下载解压Kafka 二 启动zookeeper 三 启动Kafka 四 创建测试Topic 五 启动Producer 六 启动Consumer 七 Producer窗口发送消息 八 删除数据 九 有可能遇到问题
  • Java实现_ssh远程会话连接池实现_使用ObjectPool和PooledObjectFactory

    一 需求背景 公司的大数据集群作为基础平台 为公司内部各应用提供计算和存储能力 为实现各应用单独管理并进行资源隔离 一般采用多租户管理 集群为应用租户分配了固定的计算资源 如下应用租户B 应用端在利用spark连接大数据集群时 会根据exe
  • 数组-约瑟夫环

    题目描述 已知有n个人围坐在一张圆桌上 编号依次为0 1 2 n 1 编号为n 1与编号为0的人坐在相邻的位置 现在编号为k的人从1开始报数 数到m的那个人会退出圆桌 他的下一个人又从1开始报数 数到m的那个人又出列 依此规律重复下去 请问
  • OSS对象存储的简单实现

    前提准备好阿里云对象存储的账号 gt 创建一个bucket 设置好访问权限 gt 创建用于上传文件的子账号得到accessKey和secretKey以及endpoint gt sdk例子java简单上传的例子测试 引入alicloud os
  • 快速排序(非递归)

    快速排序非递归 基本思想 默认升序 从数组中选取一个数来作为标准数 所有比这个数小的数全部放到其前面 比这个数字大的数放到其后面 此时这个标准数所处的位置就是其在有序数组中的位置 因此该标准数就不用在移动了 我们对其左右两边的数字继续执行之
  • 通过RabbitMq实现动态定时任务的实现。

    通过RabbitMq实现动态定时任务的需求 一 需求背景 定时任务的需求所谓是数不胜数 其中实现方式也是百花齐放 用得最多的大概率为Springboot中的 Scheduled cron 0 0 1 1 注解 或者是定时任务XXL JOB框
  • 蓝桥杯官网练习题(翻硬币)

    题目描述 小明正在玩一个 翻硬币 的游戏 桌上放着排成一排的若干硬币 我们用 表示正面 用 o 表示反面 是小写字母 不是零 比如 可能情形是 oo oooo 如果同时翻转左边的两个硬币 则变为 oooo oooo 现在小明的问题是 如果已
  • JAVA中getClass()以及getName()方法

    getClass public final Class
  • JSch链接linux服务器问题解决方案

    问题 Session connect java io IOException End of IO Stream Read或者Algorithm negotiation fail 方案 需要修改的文件路径 etc ssh sshd confi
  • 金融经济学研究什么?

    文章目录 什么是金融 资产和资产的回报率 资产定价 金融摩擦与金融契约理论 有效市场之争与行为金融 什么是金融 金融就是资金融通 由维基百科所定义的 金融是处理资产和负债 在 时间和确定及不确定状态下分配的领域 如何理解呢 主要从这么几点入
  • pom.xml的scope/classifier等容易忽略标签

    文章目录 一 scope标签的值 二 pom xml案例 三 scope不同值参与阶段 四 Maven的打包三种插件 五 classifier使用 1 classifier概述 2 使用场景 六 optional标签使用 一 scope标签
  • 微信小程序——生命周期

    在微信小程序中 可以通过生命周期函数来执行相应的代码操作 以下是一些常见的生命周期代码操作示例 在 onLoad 生命周期中进行数据初始化和网络请求 onLoad function options 数据初始化 this setData na
  • 3-Numpy数组操作2(索引和切片)

    索引和切片 一维 a1 np arange 0 20 print a1 print a1 1 gt gt gt 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 多维 a2 np ara
  • 目标检测中的Label Assignment

    PaperWeekly 原创 作者 燕皖 单位 渊亭科技 研究方向 计算机视觉 CNN Label Assignment Label assignment 主要是指检测算法在训练阶段 如何给特征图上的每个位置进行合适的学习目标的表示 以及如
  • idea常用插件和注释

    背景 随着idea越来越受开发者捧月 相信很多人 无论在换公司或者配置新得电脑 都会重新配置各种各样得插件 比如 lombok mybatis系列 maven等 但人得记忆都有限得 每天都在行走 从未没有停下 借用法师一句话 人生那么长 停
  • 无序链表的归并排序 - Java代码纯享版

    public class ListNodeMergeSort public static class ListNode int val ListNode next public ListNode int val this val val p