您的位置:首页 > 其它

( 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代码:(代码有详细注释)

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: