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

面试算法78:合并排序链表

题目

输入k个排序的链表,请将它们合并成一个排序的链表。
在这里插入图片描述

分析:利用最小堆选取值最小的节点

用k个指针分别指向这k个链表的头节点,每次从这k个节点中选取值最小的节点。然后将指向值最小的节点的指针向后移动一步,再比较k个指针指向的节点并选取值最小的节点。重复这个过程,直到所有节点都被选取出来。

public class Test {public static void main(String[] args) {ListNode listNode1 = new ListNode(1);ListNode listNode2 = new ListNode(2);ListNode listNode3 = new ListNode(3);ListNode listNode4 = new ListNode(4);ListNode listNode5 = new ListNode(5);ListNode listNode6 = new ListNode(6);ListNode listNode7 = new ListNode(7);ListNode listNode8 = new ListNode(8);ListNode listNode9 = new ListNode(9);listNode1.next = listNode4;listNode4.next = listNode7;listNode2.next = listNode5;listNode5.next = listNode8;listNode3.next = listNode6;listNode6.next = listNode9;ListNode[] lists = {listNode1, listNode2, listNode3};ListNode result = mergeKLists(lists);while (result != null) {System.out.println(result.val);result = result.next;}}public static ListNode mergeKLists(ListNode[] lists) {ListNode dummy = new ListNode(0);ListNode cur = dummy;PriorityQueue<ListNode> minHeap = new PriorityQueue<>((n1, n2) -> n1.val - n2.val);for (ListNode list : lists) {if (list != null) {minHeap.offer(list);}}while (!minHeap.isEmpty()) {ListNode least = minHeap.poll();cur.next = least;cur = least;if (least.next != null) {minHeap.offer(least.next);}}return dummy.next;}
}

分析:按照归并排序的思路合并链表

输入的k个排序链表可以分成两部分,前k/2个链表和后k/2个链表。如果将前k/2个链表和后k/2个链表分别合并成两个排序的链表,再将两个排序的链表合并,那么所有链表都合并了。合并k/2个链表与合并k个链表是同一个问题,可以调用递归函数解决。

public class Test {public static void main(String[] args) {ListNode listNode1 = new ListNode(1);ListNode listNode2 = new ListNode(2);ListNode listNode3 = new ListNode(3);ListNode listNode4 = new ListNode(4);ListNode listNode5 = new ListNode(5);ListNode listNode6 = new ListNode(6);ListNode listNode7 = new ListNode(7);ListNode listNode8 = new ListNode(8);ListNode listNode9 = new ListNode(9);listNode1.next = listNode4;listNode4.next = listNode7;listNode2.next = listNode5;listNode5.next = listNode8;listNode3.next = listNode6;listNode6.next = listNode9;ListNode[] lists = {listNode1, listNode2, listNode3};ListNode result = mergeKLists(lists);while (result != null) {System.out.println(result.val);result = result.next;}}public static ListNode mergeKLists(ListNode[] lists) {if (lists.length == 0) {return null;}return mergeLists(lists, 0, lists.length);}private static ListNode mergeLists(ListNode[] lists, int start, int end) {if (start + 1 == end) {return lists[start];}int mid = (start + end) / 2;ListNode head1 = mergeLists(lists, start, mid);ListNode head2 = mergeLists(lists, mid, end);return merge(head1, head2);}private static ListNode merge(ListNode head1, ListNode head2) {ListNode dummy = new ListNode(0);ListNode cur = dummy;while (head1 != null && head2 != null) {if (head1.val < head2.val) {cur.next = head1;head1 = head1.next;}else {cur.next = head2;head2 = head2.next;}cur = cur.next;}cur.next = head1 == null ? head2 : head1;return dummy.next;}
}
http://www.lryc.cn/news/269594.html

相关文章:

  • 鸿鹄电子招投标系统:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台源码与立项流程
  • node.js对应npm安装和使用
  • (self-supervised learning)Event Camera Data Pre-training
  • 关于个人Git学习记录及相关
  • 【eclipse】eclipse开发springboot项目使用入门
  • Android 13 默认关闭 快速打开相机
  • pytest pytest-html优化样式
  • Visual Studio 配置DLL
  • C/C++转WebAssembly及微信小程序调用
  • 【WPF.NET开发】弱事件模式
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • Webpack基础使用
  • 扭蛋机小程序搭建:打造互联网“流量池”
  • 解决VNC连接Ubuntu服务器打开终端出现闪退情况
  • flutter是什么
  • GET和POST请求
  • 基于电商场景的高并发RocketMQ实战-Broker写入读取流程性能优化总结、Broker基于Pull模式的主从复制原理
  • 前端DApp开发利器,Ant Design Web3 正式发布 1.0
  • [RoarCTF 2019]Easy Java(java web)
  • Abaqus许可管理策略
  • 对采集到的温湿度数据,使用python进行数据清洗,并使用预测模型进行预测未来一段时间的温湿度数据。
  • 嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录
  • Java日期工具类LocalDateTime
  • 从C到C++1
  • [Angular] 笔记 18:Angular Router
  • 微服务全链路灰度方案介绍
  • 低代码开发OA系统 低代码平台如何搭建OA办公系统
  • 构建Python的Windows整合包教程
  • 《整机柜服务器通用规范》由OCTC正式发布!浪潮信息牵头编制
  • Linux:修改和删除已有变量