23,合并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) {
          if (lists.length == 0) return null;
        ListNode dumy=new ListNode(0);
        int n=lists.length;

        while(n>1)
        {
          int  k=(n+1)/2;
            for(int i=0;i<n/2;++i)
            {
              lists[i]= mergeTwoLists(lists[i],lists[i+k]);            
            }
           n=k; 
        }
       return lists[0]; 
    }
     public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
     
        ListNode dumy=new ListNode(0);
        ListNode cur=dumy;
        while((l1!=null)&&(l2!=null))
        {  
        
            if(l1.val<l2.val){
                  cur.next=l1;
                  l1=l1.next;         
            }     
            else
            { 
                cur.next=l2;
                l2=l2.next;
            }   
            cur=cur.next;
        }
        cur.next=(l1!=null)?l1:l2;
        return dumy.next;
    }
}

猜你喜欢

转载自blog.csdn.net/huanghuansen/article/details/83210982
今日推荐