( Leetcode 23 ) Merge k Sorted Lists
2016-05-15 21:13
387 查看
题目:Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
解题思路:
这道题的主要解题思路类似于归并排序,分和拆,同样这道题也分为两大部分,第一大部分主要解决拆分链表的问题,将链表按照两两为一对进行拆分;第二大部分主要解决归并链表的问题,将两个已经排好序的链表按照从小到大进行合并。
一、拆分链表
主要思想就是每次将链表按照两两为一对进行拆分之后传递给函数mergeTwoLists(ListNode l1, ListNode l2),并且将返回的新的链表的头结点存进原链表数组。设定一个 k 临时记录链表数组的动态长度,当一次拆分完成之后将 k 赋值给链表数组长度 length,之后将 k 置零。
还有一点需要注意的就是需要处理链表数组长度为奇数的情况,如果为奇数,直接将最后一个链表加入到新形成的链表数组之中。
最后得到的结果存在 ListNode lists[0] 之中,在整个程序的运行过程之中并没有新开空间,一直沿用原链表数组
二、合并链表
合并链表的部分类似于LeetCode 21 题 Merge Two Sorted Lists,具体解法看我的博客(点击打开链接)
具体看下面的Java代码:(代码有详细注释)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
解题思路:
这道题的主要解题思路类似于归并排序,分和拆,同样这道题也分为两大部分,第一大部分主要解决拆分链表的问题,将链表按照两两为一对进行拆分;第二大部分主要解决归并链表的问题,将两个已经排好序的链表按照从小到大进行合并。
一、拆分链表
主要思想就是每次将链表按照两两为一对进行拆分之后传递给函数mergeTwoLists(ListNode l1, ListNode l2),并且将返回的新的链表的头结点存进原链表数组。设定一个 k 临时记录链表数组的动态长度,当一次拆分完成之后将 k 赋值给链表数组长度 length,之后将 k 置零。
还有一点需要注意的就是需要处理链表数组长度为奇数的情况,如果为奇数,直接将最后一个链表加入到新形成的链表数组之中。
最后得到的结果存在 ListNode lists[0] 之中,在整个程序的运行过程之中并没有新开空间,一直沿用原链表数组
二、合并链表
合并链表的部分类似于LeetCode 21 题 Merge Two Sorted Lists,具体解法看我的博客(点击打开链接)
具体看下面的Java代码:(代码有详细注释)
public class Solution { public ListNode mergeKLists(ListNode[] lists) { if( lists.length <= 0 ){ return null; } //k记录每新形成的ListNode[]的长度 int k , i; int length = lists.length; do{ k = 0; for( i = 0; i < length && i+1 < length; i += 2 ){ lists[k++] = mergeTwoLists( lists[i], lists[i+1] ); } //处理非偶数情况,如果ListNode[]里面链表个数为奇数的时候 //因为前面是按照两两进行排序比较,所以将最后一个直接加到 //链表里面 if( i == length-1 ){ lists[k++] = lists[length - 1]; } length = k; }while( k > 1 ); //按照前面 k++ 的做法,k 始终靠前一个,所以当链表数组 //长度只剩一个的时候,k指向下标1 return lists[0]; } //此函数用于合并两个链表,并且按照从小大大排序 public ListNode mergeTwoLists( ListNode l1, ListNode l2 ) { if ( l1 == null ) return l2; if ( l2 == null ) return l1; //最终的返回结果是以l1为中心链,l2往l1上面插结点 ListNode tmp; if ( l1.val > l2.val ) { //交换两个头结点 tmp = l2; l2 = l1; l1 = tmp; } ListNode p = l1; while ( l2 != null ) { while ( p.next != null && p.next.val <= l2.val ) p = p.next; tmp = p.next; p.next = l2; l2 = tmp; } return l1; } }程序运行时间 4ms。
相关文章推荐
- java垃圾收集器
- Java编程思想[二]操作符
- 简述:上篇博客
- 概论
- php trim() 函数实例讲解
- 自定义UITabbarController及向UITabBar中添加自定义按钮
- 数据库索引的优缺点
- SVN版本控制库学习笔记
- SVN版本控制库学习笔记
- 前端和后端不兼容(必须以同一处理器为目标)
- 初始化块
- [JAVA][RCP] Eclipse4/RCP/Lifecycle
- 学习进度表第十一周
- jdbc在mysql下一次执行多条sql脚本
- 用R语言做正态分布检验
- struts2学习笔记
- struts2学习笔记
- ant无法构建源码包含中文的项目--KeyWord:ant,中文,乱码
- (hzau)华中农业大学第四届程序设计大赛网络同步赛 G: Array C
- Android退出程序的两种方式killProcess()和System.exit()