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

yizhihongxing

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日

相关文章

  • sai怎么自制笔刷? sai制作独一无二的笔画的教程

    下面是详细讲解如何在SAI中自制笔刷的教程: 如何自制笔刷 在SAI软件中,我们可以通过自定义笔刷(以下简称“自制笔刷”)来制作独特的笔画。具体步骤如下: 步骤1:打开SAI软件并进入钢笔工具 对于初学者或者新手,建议先熟悉SAI的各种基本工具,特别是钢笔工具,这是自制笔刷的基础。当你进入SAI软件后,单击左侧工具栏中的“钢笔工具”图标,你将进入钢笔编辑模式…

    other 2023年6月27日
    00
  • 一篇文章带你深入了解Java基础(3)

    我来详细讲解一下“一篇文章带你深入了解Java基础(3)”这篇攻略。 标题 一篇文章带你深入了解Java基础(3) 简介 这篇文章主要介绍了Java基础的一些概念和知识点,帮助读者更深入地了解Java编程。 正文 1. 面向对象编程 Java是一种面向对象的编程语言,这意味着它可以使用对象来表示现实世界中的事物。面向对象编程有三个重要的特征:封装、继承和多态…

    other 2023年6月27日
    00
  • SpringBoot项目启动时如何读取配置以及初始化资源

    要让SpringBoot项目在启动时读取配置以及初始化资源,可以采用以下两种方法: 通过@Configuration注解的类来配置 在SpringBoot项目中,可以使用@Configuration注解来指定一个类为配置类,这个类中可以定义Bean和配置信息。在配置类中,可以使用@Bean注解定义Bean,也可以使用@Value注解来读取配置信息。在这个类中…

    other 2023年6月20日
    00
  • iOS13.3正式版固件下载地址 iOS13.3正式版支持机型及固件下载

    iOS13.3正式版固件下载地址 iOS 13.3正式版是苹果公司发布的最新操作系统版本之一。在本攻略中,我将为您提供iOS 13.3正式版固件的下载地址,并列出支持该版本的机型。请按照以下步骤进行操作: 步骤一:访问官方网站 首先,您需要访问苹果公司的官方网站以获取iOS 13.3正式版固件的下载地址。您可以在以下网址找到官方下载页面:https://ww…

    other 2023年8月4日
    00
  • 如何实现bean初始化摧毁方法的注入

    实现bean初始化摧毁方法的注入,需要通过Spring的IOC容器实现。Spring提供了两种方式来实现bean的初始化和销毁方法的注入:使用注解和使用XML配置文件。 一、使用注解的方式: 使用注解@PostConstruct来指定bean初始化方法,使用@PreDestroy来指定bean销毁方法。 @Component public class MyB…

    other 2023年6月20日
    00
  • 魔兽6.0恶魔术属性 6.0恶魔术优先级选择推荐

    魔兽6.0恶魔术属性攻略 1. 恶魔术属性概述 恶魔术是魔兽6.0版本中的一项重要属性,它可以提升恶魔单位的实力和技能效果。了解恶魔术属性的优先级选择是提高游戏战斗能力的关键。 2. 恶魔术属性优先级选择推荐 2.1. 根据恶魔单位特点选择属性 每个恶魔单位在游戏中都有不同的特点和技能,因此选择恶魔术属性时要考虑单位的特殊需求。 示例说明1:对于火焰恶魔单位…

    other 2023年6月28日
    00
  • 设置windows共享文件夹后不能通过用户名密码访问的解决方法

    设置Windows共享文件夹后,如果出现不能通过用户名密码访问的情况,可以通过以下步骤进行解决: 步骤一:检查网络和共享选项设置 首先,我们需要检查网络和共享选项设置是否正确。具体操作如下: 打开控制面板,选择“网络和共享中心”; 点击“高级共享设置”; 确保“网络发现”、“文件和打印机共享”、“共享文件夹的密码保护”都已经启用。 如果这些选项没有启用,需要…

    other 2023年6月27日
    00
  • vbscript基础篇 – vbs数组Array的定义与使用方法

    VBScript基础篇 – VBScript数组Array的定义与使用方法 VBScript数组是一种用于存储多个数据项的有序集合。数组的使用可以使得数据项可以通过单个变量名进行访问。本篇文章将介绍VBScript中数组的定义、初始化和使用方法。 数组的定义 在VBScript中,数组是通过使用 Dim 语句进行定义的。语法格式如下: Dim arrayNa…

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