No.023:Merge k Sorted Lists
问题:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
官方难度:
Hard
翻译:
合并k个已排序的链表,得到一个新的链表并且返回其第一个节点。分析并阐述其复杂度。
- 这是No.021(Merge Two Sorted Lists)的深入研究。
- 可以借鉴归并排序的思想,对于长度为k的数组,依次进行二路归并,返回这两个链表合并之后的头结点(利用No.021现成的代码),下次递归时,入参为长度为(k+1)/2的头结点数组。
- 在k为奇数时,先去掉最后一项,剩余项依次二路归并,再将最后一项放入新的数组。
- 由于使用递归,所以将递归方法独立出来,因为只要做依次入参检查即可。
- 算法的复杂度与归并排序相同,即O(nlogn)的时间复杂度,O(n)的空间复杂度。
解题代码:
- public static ListNode mergeKLists(ListNode[] lists) {
- if (lists == null) {
- throw new IllegalArgumentException("Input error");
- }
- if (lists.length == 0) {
- return null;
- }
- return mergeListsArray(lists);
- }
- // 合并 k 个有序链表
- public static ListNode mergeListsArray(ListNode[] lists) {
- // 递归终点
- if (lists.length == 1) {
- return lists[0];
- }
- // 下一次递归的头结点数组
- ListNode[] next = new ListNode[(lists.length + 1) >>> 1];
- // 二路归并
- if (lists.length % 2 == 0) {
- for (int i = 0; i < lists.length; i += 2) {
- next[i >>> 1] = merge2Lists(lists[i], lists[i + 1]);
- }
- } else {
- for (int i = 0; i < lists.length - 1; i += 2) {
- next[i >>> 1] = merge2Lists(lists[i], lists[i + 1]);
- }
- next[next.length - 1] = lists[lists.length - 1];
- }
- return mergeListsArray(next);
- }
- // 合并2个有序链表
- private static ListNode merge2Lists(ListNode l1, ListNode l2) {
- if (l1 == null) {
- return l2;
- }
- if (l2 == null) {
- return l1;
- }
- // 返回的第一个节点
- ListNode first = l1.val > l2.val ? l2 : l1;
- // 上一个节点
- ListNode last = new ListNode(0);
- while (true) {
- if (l1.val > l2.val) {
- // 交换l1节点和l2节点,保证下一次循环仍然以l1节点为基准
- ListNode swapNode = l2;
- l2 = l1;
- l1 = swapNode;
- }
- // 将last节点的next指针指向l1,同时更新last
- last.next = l1;
- last = l1;
- // 带排序的链表遍历完成,剩余链表自然有序
- if (l1.next == null) {
- l1.next = l2;
- break;
- }
- l1 = l1.next;
- }
- return first;
- }
mergeKLists
相关链接:
https://leetcode.com/problems/merge-k-sorted-lists/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!
No.023:Merge k Sorted Lists的更多相关文章
- python 中的堆 (heapq 模块)应用:Merge K Sorted Lists
堆是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短 ...
- LeetCode OJ:Merge k Sorted Lists(归并k个链表)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 类 ...
- LeetCode 023 Merge k Sorted Lists
题目要求:Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and ...
- LeetCode之“链表”:Merge Two Sorted Lists && Merge k Sorted Lists
1. Merge Two Sorted Lists 题目链接 题目要求: Merge two sorted linked lists and return it as a new list. The ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
- 71. Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- LeetCode——Merge k Sorted Lists
Discription: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its ...
- 【Merge K Sorted Lists】cpp
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
随机推荐
- TODO:Linux安装PHP MongoDB驱动
TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...
- iOS-数据持久化详细介绍
1.iOS-数据解析XML解析的多种平台介绍 2.iOS-数据持久化基础-JSON与XML数据解析 3.iOS-数据持久化基础-沙盒机制 4. 数据持久化的几种方式: 1)plist(XML属性列 ...
- Content-Type List
Content-Type List Description of Data Content Typical Filename Extensions MIME type/subtype Te ...
- [C#] Socket 通讯,一个简单的聊天窗口小程序
Socket,这玩意,当时不会的时候,抄别人的都用不好,简单的一句话形容就是“笨死了”:也是很多人写的太复杂,不容易理解造成的.最近在搞erlang和C的通讯,也想试试erlang是不是可以和C#简单 ...
- 无法启动WP Emulator
记得以前Vware不能运行设置的东西了吗?http://www.cnblogs.com/dunitian/p/4480750.html 如果不清楚可以参考上面的链接 重启的时候选择第二项 重新打开就o ...
- 解密jQuery事件核心 - 委托设计(二)
第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...
- Android之计算缓存大小并且清空缓存
转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...
- Jquery通过Ajax方式来提交Form表单
今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...
- ASP.NET 5 单元测试中使用依赖注入
相关博文:<ASP.NET 5 使用 TestServer 进行单元测试> 在上一篇博文中,主要说的是,使用 TestServer 对 ASP.NET 5 WebApi 进行单元测试,依赖 ...
- 小菜学习设计模式(四)—原型(Prototype)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...