合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:分治法
多个链表,两两合并,第一个和第二个合并,第三个和第四个合并....
如果链表的个数是奇数,最后一个先不处理,添加到这次处理完的链表队列后面
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int n = lists.length;
if(n<1) return null;
if(n==1) return lists[0];
while(n>1){
int i;
for(i=0;i<n/2;i++){
lists[i] = mergeTwoLists(lists[i*2],lists[2*i+1]);
}
if(n%2==1){
lists[i] = lists[n-1];
n++;
}
n/=2;
}
return lists[0];
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p = l1,q = l2;
int t=0;
ListNode result = new ListNode(0);
ListNode x = result;
while(p!=null||q!=null)
{
x.next = new ListNode(0);
x = x.next;
if(p!=null&&q!=null)
{
if(p.val<=q.val)
{
x.val = p.val;
p = p.next;
}
else
{
x.val = q.val;
q = q.next;
}
}
else if(p!=null)
{
x.val = p.val;
p = p.next;
}
else
{
x.val = q.val;
q = q.next;
}
}
return result.next;
}
}