Java 利用递归实现链表的归并排序

Java 利用递归实现链表的归并排序

链表归并排序的思想

链表归并排序的思想与普通的排序算法类似,通过将待排数据不断分割直到只有一个节点,再利用 merge() 函数将它们合并起来,直到整个链表有序。相对于数组,链表的归并排序是一种稳定的排序,并且能够在O(n log n)的时间复杂度内完成排序。

Java 代码实现

以下是使用递归实现链表归并排序的 Java 代码示例:

public ListNode sortList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    ListNode right = sortList(slow.next);
    slow.next = null; 
    ListNode left = sortList(head);
    return merge(left, right);
}

private ListNode merge(ListNode l, ListNode r) {
    ListNode dummyHead = new ListNode(0);
    ListNode tail = dummyHead;
    while (l != null && r != null) {
        if (l.val < r.val) {
            tail.next = l;
            l = l.next;
        } else {
            tail.next = r;
            r = r.next;
        }
        tail = tail.next;
    }
    tail.next = l != null ? l : r;
    return dummyHead.next;
}

代码说明

该实现中,sortList() 函数采用快慢指针的方式将链表平分成左右两部分,接着递归调用 sortList() 函数对左右两部分进行分别排序,最后调用 merge() 函数将左右两部分有序地合并成一个链表。merge() 函数中,我们利用 dummyHead 和 tail 来生成一个新的链表。

代码使用示例

以下是一个简单的使用示例:

ListNode head = new ListNode(4);
head.next = new ListNode(2);
head.next.next = new ListNode(1);
head.next.next.next = new ListNode(3);
ListNode sortedList = sortList(head);
System.out.println(sortedList.val); // output: 1
System.out.println(sortedList.next.val); // output: 2
System.out.println(sortedList.next.next.val); // output: 3
System.out.println(sortedList.next.next.next.val); // output: 4

上述示例中,我们通过创建一个未排序的链表,并调用 sortList() 函数对其进行排序,最后输出排序后的链表节点的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 利用递归实现链表的归并排序 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 页面加载完成后再执行JS的jquery写法以及区别说明

    在网页中,我们经常需要在页面加载完成后再执行一些 JavaScript 代码。这个需求非常普遍,比如我们需要在 DOM 树构建完成后再去操作元素,或者需要等待图片等资源加载完成后再进行后续的逻辑处理。在这种需求下,我们可以使用 JQuery 提供的 ready() 方法来处理,同时,使用 ready() 方法还有一定的性能优势。下面是详细的攻略: 什么是 j…

    other 2023年6月25日
    00
  • einsum函数介绍-张量常用操作

    einsum函数是Numpy中用来处理张量常用操作的函数之一。它可以同时实现张量的乘积、收缩、广播等操作。下面将全面介绍einsum函数的用法,希望能对读者有所帮助。 einsum函数的语法 Numpy.einsum(subscripts, *operands, out=None, dtype=None, order=’K’, casting=’safe’,…

    其他 2023年4月16日
    00
  • 微信开发者工具如何修改模拟器位置 微信开发者工具修改模拟器位置教程

    微信开发者工具如何修改模拟器位置 微信开发者工具提供了模拟器的功能,可以在开发过程中方便地预览和调试小程序。有时候我们需要修改模拟器的位置,以适应不同的预览场景。本文将详细讲解如何修改微信开发者工具中模拟器的位置。 步骤 步骤1:进入开发者工具 首先,我们需要进入微信开发者工具,并打开自己的小程序项目。 步骤2:打开模拟器 在开发者工具的顶部菜单栏中,可以找…

    other 2023年6月26日
    00
  • h3c交换机mac地址绑定、三层交换机固定ip上网、三层交换机端口配置ip地址的方法

    H3C交换机MAC地址绑定 在H3C交换机上,可以通过MAC地址绑定来限制特定设备的网络访问。下面是进行MAC地址绑定的步骤: 登录到H3C交换机的管理界面。 进入交换机的全局配置模式,输入以下命令: configure terminal 进入接口配置模式,选择要进行MAC地址绑定的接口,例如接口GigabitEthernet1/0/1,输入以下命令: in…

    other 2023年7月31日
    00
  • iOS项目的开发命名规范教程

    iOS项目的开发命名规范是一种约定俗成的规范,用于确保团队成员之间在开发过程中可以保持一致性和便于维护。以下是一份完整的iOS项目开发命名规范教程: 1. 命名规范 1.1. 类型名称 类型名称应该是名词或名词短语,采用大驼峰命名法。 如果类型名称包含多个单词,则第一个单词的首字母应大写,后续单词首字母也应大写,不使用下划线连接,例如: class View…

    other 2023年6月26日
    00
  • vscode ssh安装librosa处理音频的解决方法

    安装librosa音频处理库,需要在操作系统上安装Python和相关的依赖库。当在本地计算机上进行安装时,这些依赖库可以通过pip命令直接安装。但是,当使用ssh连接到远程服务器时,我们需要特别注意。 以下是基于VSCode SSH连接到远程服务器上安装librosa的详细攻略。 步骤一:连接到远程服务器 首先,打开VSCode,按下”Ctrl+Shift+…

    other 2023年6月27日
    00
  • 深入解析Java中的内部类

    深入解析Java中的内部类 什么是内部类 内部类(Inner class)是Java中一种独特的类形式,它定义在其他类的内部。与传统的类不同,内部类可以访问包含它的类的私有成员和方法,也可以用来实现封装、组织和扩展性等特性。 内部类可以划分为以下几种类型: 成员内部类(Member Inner class) 局部内部类(Local Inner class) …

    other 2023年6月27日
    00
  • python的pytest框架之命令行参数详解(下)

    下面是关于“python的pytest框架之命令行参数详解(下)”的完整攻略。 标题 python的pytest框架之命令行参数详解(下) 概述 前面讲解了pytest框架中一些常用的命令行参数,本篇文章将继续讲解一些更为高级的参数,包括fixture的范围以及参数化运行测试用例。 fixture范围 fixture是pytest框架中常用的一种功能,可以用…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部