合并 k 个排序链表。
代码实现:
import java.util.Arrays;
 
class ListNode{
    int val;
    ListNode next;
    
    public ListNode(int val) {
        this.val=val;
    }
}
 
public class MergeList {
    
    private static ListNode first=null;
    private static ListNode second=null;
    private static ListNode three=null;
    
    /**
     * 链表插入数据
     * @param val
     */
     public void addNode(int val){
            ListNode newNode=new ListNode(val);
            if(first==null){
                first=newNode;
                return;
            }
            ListNode tmp=first;
            while(tmp.next!=null){
                tmp=tmp.next;
            }
            //add Node to end
            tmp.next=newNode;
        }
     
     public void addNode2(int val){
            ListNode newNode=new ListNode(val);
            if(second==null){
                second=newNode;
                return;
            }
            ListNode tmp=second;
            while(tmp.next!=null){
                tmp=tmp.next;
            }
            //add Node to end
            tmp.next=newNode;
        }
     
     public void addNode3(int val){
            ListNode newNode=new ListNode(val);
            if(three==null){
                three=newNode;
                return;
            }
            ListNode tmp=three;
            while(tmp.next!=null){
                tmp=tmp.next;
            }
            //add Node to end
            tmp.next=newNode;
        }
    
     /**
      * 输出整个链表
      * @param head
      * @param indexName
      */
    public void printNode(ListNode head,String indexName){
        System.out.println(indexName);
        while(head!=null){
            System.out.print(head.val+" ");
            head=head.next;
        }
        System.out.println();
    }
    
    public static void main(String[] args) {
        MergeList ml=new MergeList();
        ListNode[] lists=new ListNode[3];
        for(int i=1;i<4;i++){
            ml.addNode(i);
        }
        for(int i=2;i<5;i++){
            ml.addNode2(i);
        }
        for(int i=3;i<6;i++){
            ml.addNode3(i);
        }
        ml.printNode(first,"first链表");
        ml.printNode(second,"second链表");
        ml.printNode(three,"three链表");
        
        lists[0]=first;
        lists[1]=second;
        lists[2]=three;
        ListNode mergeNode=ml.mergeKLists(lists);
        ml.printNode(mergeNode,"merge链表");
    }
    
    /**
     * 合并链表
     * @param lists
     * @return
     */
    public ListNode mergeKLists(ListNode[] lists) {
        return partition(lists, 0, lists.length - 1);
    }
    
    /**
     * 分治思想。两两比较排序再合并
     * @param lists
     * @param start
     * @param end
     * @return
     */
    public ListNode partition(ListNode[] lists, int start, int end) {
        if (start == end) {
            return lists[start];
        }
 
        if (start < end) {
            int mid = (start + end) / 2;
            ListNode l1 = partition(lists, start, mid);
            ListNode l2 = partition(lists, mid + 1, end);
            return mergeTwoLists(l1, l2);
        }
 
        return null;
    }
    
    /**
     * 两个链表进行比较合并
     * @param l1
     * @param l2
     * @return
     */
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l2 == null) return l1;
        if (l1 == null) return l2;
 
        if (l1.val < l2.val) {
            ListNode tmp = l1;
            tmp.next = mergeTwoLists(l1.next, l2);
            return tmp;
        } else {
            ListNode tmp = l2;
            tmp.next = mergeTwoLists(l1, l2.next);
            return tmp;
        }
    }
 
}









