合并n个链表

  

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

示例:

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

  

    public static ListNode mergeKLists(ListNode[] lists){
        int count=lists.length/2+lists.length%2;
        if(count==0){
            return null;
        }
        ListNode[] newLists=new ListNode[count];
        for(int i=0;i<lists.length;i=i+2){
            if(lists.length<=i+1){
                newLists[count-1]=lists[i];
                break;
            }
            newLists[i/2]=mergeTwoLists(lists[i],lists[i+1]);
        }
        if(newLists.length>1){
           return mergeKLists(newLists);
        }
        return newLists.length==0?null:newLists[0];
    }
View Code
    public static ListNode mergeTwoLists(ListNode l1,ListNode l2){
        ListNode dumb=new ListNode(0);
        ListNode head=dumb;
        while (l1!=null&&l2!=null){
          if(l1.val<l2.val){
            dumb.next=l1;
            l1=l1.next;
          }else{
            dumb.next=l2;
            l2=l2.next;
          }
          dumb=dumb.next;
        }
        dumb.next=(l1==null?l2:l1);
        return head.next;
    }
View Code

思路:

  1.集合里的链表2个合并在一起放入新的集合中。

  2.新集合的大小为  原集合大小整除2加上原集合大小整除2取模。

  3.将新集合递归调用,当新集合里的元素只有1个时即为结果返回即可。

原文地址:https://www.cnblogs.com/wuyouwei/p/11773027.html