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日

相关文章

  • C语言入门篇–初识指针和指针变量

    C语言入门篇–初识指针和指针变量 指针是C语言中非常重要的概念,也是初学者最难理解的地方之一。本文将介绍指针的基本概念、使用方法和注意事项。 什么是指针 指针是一种变量类型,它存储的是一个地址,指向内存中的某个数据。指针可以访问和操作这个数据,使程序更加灵活。 如何定义指针变量 定义指针变量需要指定其数据类型和名称。一般使用*符号表示指针变量,例如: in…

    other 2023年6月27日
    00
  • Python字符串切片操作知识详解

    Python字符串切片操作是一项非常重要的基本操作。字符串切片操作可以取出一个字符串中的一部分,而不影响原字符串的内容。 1. 基本语法 字符串切片的基本语法如下所示: string[start:end:step] 其中,start是起始位置,end是结束位置(不包含在被切片的结果中),step是间隔。 2. 示例说明 下面是两个示例说明: 2.1. 取出字…

    other 2023年6月20日
    00
  • 优酷会员怎么取消自动续费并解绑支付宝?

    以下是详细讲解“优酷会员怎么取消自动续费并解绑支付宝”的攻略: 一、取消自动续费 登录账号: 首先,需要登录你的优酷账号。 进入账户中心: 进入优酷账户中心,选择“会员中心”,找到你需要取消自动续费的会员类型。 取消自动续费: 在会员中心页面中,找到你需要取消自动续费的会员类型,点击会员卡片下方的“自动续费”,然后选择“关闭自动续费”即可取消自动续费。 示例…

    other 2023年6月27日
    00
  • Python处理yaml和嵌套数据结构技巧示例

    Python处理YAML和嵌套数据结构技巧示例攻略 介绍 YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据交换。Python提供了许多库来处理YAML数据,其中最常用的是PyYAML库。本攻略将详细介绍如何使用Python处理YAML数据,并提供两个示例说明。 步骤 步骤1:安装PyYAML…

    other 2023年7月28日
    00
  • 手把手教你使用Navicat生成MySQL测试数据

    以下是使用Navicat生成MySQL测试数据的完整攻略: 步骤一:连接数据库 打开Navicat软件,并点击“连接”按钮。 在弹出的连接窗口中,填写数据库连接信息,包括主机名、端口号、用户名和密码等。 点击“连接”按钮,成功连接到MySQL数据库。 步骤二:选择目标数据库 在Navicat左侧的导航栏中,展开已连接的数据库列表。 选择要生成测试数据的目标数…

    other 2023年10月16日
    00
  • 如何使用TS对axios的进行简单封装

    下面我将详细讲解如何使用 TypeScript 对 Axios 进行简单封装。 第一步:安装依赖 我们首先需要安装 axios 和 @types/axios 两个依赖。 @types/axios 是对 axios 这个库的 TypeScript 类型定义文件,我们使用 TypeScript 的时候需要依赖。 npm install axios @types/…

    other 2023年6月25日
    00
  • 有效阻止Win10悄悄下载和更新后自动重启计算机的技巧

    针对“有效阻止Win10悄悄下载和更新后自动重启计算机”的技巧,这里提供一份完整攻略。 有效阻止Win10悄悄下载和更新后自动重启计算机 背景 Win10自从推出以来,强制更新和自动重启问题一直备受诟病。在未经用户同意的情况下,Win10会悄悄地下载更新并自动重启计算机,这不仅浪费了用户的时间,还可能导致一些重要数据的丢失。因此,寻找有效的方法来阻止Win1…

    other 2023年6月27日
    00
  • Ubuntu 19.10 将于2020.7.17结束生命周期,官方建议迁移至 Ubuntu 20.04

    以下是Ubuntu 19.10结束生命周期迁移至Ubuntu 20.04的完整攻略: 1.备份重要数据 在进行升级之前,请务必备份所有重要数据。升级过程中可能会出现问题,备份可以有效避免数据丢失的风险。 2.更新系统 在开始升级过程之前,需要先确保当前系统是最新版本。执行以下命令更新系统: sudo apt update && sudo ap…

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