合并K个排序链表

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解法:
采用两两个合并的的方法
1.设置一个两个列表合并的函数
2.再用二路归并进行函数调用
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */


class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        //有K个链表
        int k = lists.length;
        if(k==0) return null;
        ListNode result = lists[0];
        while (k > 1) {            
            for (int i = 0; i < k/2; i++) 
                lists[i] = mergeTwoLists(lists[i], lists[i + (k + 1)/2]);
            k = (k + 1) / 2;
        }
        return lists[0];
    }
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode p1,p2;
        p1 = l1;
        p2=l2;
        ListNode head = new ListNode(0);
        ListNode r = head;
        if(l1==null) return l2;
        if(l2==null) return l1;
        //合并
        while(p1!=null && p2!=null){
            if(p1.val <= p2.val){
                r.next = p1;
                r = p1;
                p1 = p1.next;
            }else{
                r.next = p2;
                r = p2;
                p2 = p2.next;
            }    
        }
        if(p1==null){
            r.next = p2;
            r = p2;
        }     
        if(p2==null){
            r.next = p1;
            r = p1;
        }
        return head.next;
    }
}

 

posted @ 2019-01-23 14:41  木叶小寒江  阅读(104)  评论(0编辑  收藏  举报