当前位置: 首页 > news >正文

java数据结构与算法(链表归并排序)

前言

链表的归并排序和数组的归并排序类似,只是在操作原有操作数组的基础上对链表进行操作。喜欢的可以试试吧。

实现原理

链表归并排序是一种常见的排序算法,它利用了归并排序的思想来对链表进行排序。与数组不同,链表在归并排序中的主要挑战是如何将链表分割为两个子链表以及如何合并两个有序的子链表。

下面是链表归并排序的一般步骤:

  1. 分割阶段:找到链表的中点,将链表分成两个子链表。可以使用快慢指针技巧来找到中点。

  2. 递归排序:对两个子链表分别进行递归排序,直到子链表长度为1或0。

  3. 合并阶段:将两个有序的子链表合并成一个有序的链表。可以使用迭代或递归来实现合并操作。

具体代码实现

class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}public class MergeSortLinkedList {public ListNode mergeSort(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 mid = slow.next;slow.next = null;ListNode left = mergeSort(head);ListNode right = mergeSort(mid);return merge(left, right);}private ListNode merge(ListNode left, ListNode right) {ListNode dummy = new ListNode(0);ListNode current = dummy;while (left != null && right != null) {if (left.val < right.val) {current.next = left;left = left.next;} else {current.next = right;right = right.next;}current = current.next;}if (left != null) {current.next = left;}if (right != null) {current.next = right;}return dummy.next;}public static void printList(ListNode head) {ListNode current = head;while (current != null) {System.out.print(current.val + " -> ");current = current.next;}System.out.println("null");}public static void main(String[] args) {MergeSortLinkedList sorter = new MergeSortLinkedList();// 创建链表ListNode head = new ListNode(4);head.next = new ListNode(2);head.next.next = new ListNode(1);head.next.next.next = new ListNode(3);// 打印原始链表System.out.println("Original List:");printList(head);// 对链表进行归并排序ListNode sortedHead = sorter.mergeSort(head);// 打印排序后的链表System.out.println("\nSorted List:");printList(sortedHead);}
}

QA:待定

http://www.lryc.cn/news/346670.html

相关文章:

  • 最新网页版USB转串口芯片CH340中文规格书手册(20240511)
  • 关于 MongoDB 数据库基本操作的详细介绍
  • 【网络基础】网络层 之 IP协议与分片、网段划分、IP地址分类、子网掩码与路由
  • C语言实现猜数字小游戏
  • iOS Failed to create provisioning profile.
  • 122. Kafka问题与解决实践
  • Pytorch常用的函数(九)torch.gather()用法
  • 用爬虫解决问题
  • 机器学习-有监督学习
  • 【详细介绍下Visual Studio】
  • 【Golang】实现 Excel 文件下载功能
  • 设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则
  • 深入探讨布隆过滤器算法:高效的数据查找与去重工具
  • 基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能
  • ubuntu18.04安装docker容器
  • 202212青少年软件编程(Python)等级考试试卷(二级)
  • 单播、组播、广播
  • 吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14
  • 笔试强训未触及题目(个人向)
  • 【YOLO改进】换遍MMDET主干网络之EfficientNet(基于MMYOLO)
  • uniapp下拉选择组件
  • 高斯数据库创建函数的语法
  • 【.NET Core】你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟
  • ubuntu删除opencv
  • K8s源码分析(二)-K8s调度队列介绍
  • OpenGL ES 面试高频知识点(二)
  • 2024第十六届“中国电机工程学会杯”数学建模A题B题思路分析
  • 面向对象的三大特性:封装、继承、多态
  • 目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(中)
  • 前端GET请求下载后端返回数据流文件,并且处理window.open方法跳转白屏方法