public class Solution {
    public ListNode mergeTwoLists(ListNode left, ListNode right) {
        ListNode p = left;
        ListNode q = right;
        ListNode newHead = null;
        ListNode prev = null;

        while (p != null && q != null) {
            ListNode newNode = null;
            if (p.val <= q.val) {
                newNode = new ListNode(p.val);
                p = p.next;
            } else {
                newNode = new ListNode(q.val);
                q = q.next;
            }
            if (newHead == null) {
                newHead = newNode;
            }
            if (prev != null) {
                prev.next = newNode;
            }
            prev = newNode;
        }
        while (p != null) {
            ListNode newNode = new ListNode(p.val);
            if (newHead == null) {
                newHead = newNode;
            }
            if (prev != null) {
                prev.next = newNode;
            }
            prev = newNode;
            p = p.next;

        }
        while (q != null) {
            ListNode newNode = new ListNode(q.val);
            if (newHead == null) {
                newHead = newNode;
            }
            if (prev != null) {
                prev.next = newNode;
            }
            prev = newNode;
            q = q.next;

        }
        return newHead;
    }
    public ListNode mergeKLists (ArrayList<ListNode> lists) {
        // write code here
        int sz = lists.size();
        if (sz == 0) {
            return null;
        }
        if (sz == 1) {
            return lists.get(0);
        }
        if (sz == 2) {
            return mergeTwoLists(lists.get(0), lists.get(1));
        }

        new ArrayList<>(lists.subList(0, sz/2));
        
        return  mergeTwoLists( 
		  		mergeKLists(new ArrayList<>(lists.subList(0, sz/2))), 
         		mergeKLists(new ArrayList<>(lists.subList(sz/2, sz)))
		);
    }
}

采用分治思想,将原链表数组分成左右两部分(看成一个整体),最后利用上一题写的两个链表合并方法递归解决。