合并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==0)return null;
        while (n > 1) {             //两两归并有序链表,单个链表不处理
            int k=(n + 1)/2;        //两两归并之后的链表个数
            for (int i=0; i<n/2; i++) {
                lists[i]=merge(lists[i],lists[i+k]);//比如6个链表,0-3   1-4   2-5 
            }
            n = k;     
        }
        return lists[0];
       }
    //合并两个有序链表,使用的递归
    public ListNode merge(ListNode l1,ListNode l2){
        ListNode head=null;
        if(l1==null)return l2;
        if(l2==null)return l1;
            if(l1.val>l2.val){
                head=l2;
                head.next=merge(l1,l2.next);
            }else {
                head=l1;
                head.next=merge(l1.next,l2);
            }  
        return head;
    }
    
    
}

 

posted @ 2018-09-04 16:58  吃土豆鸭  阅读(142)  评论(0编辑  收藏  举报