合并K个排序链表
    合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
    示例:
    输入:
    [
    1->4->5,
    1->3->4,
    2->6
    ]
    输出: 1->1->2->3->4->4->5->6

    解法:类似于合并两个链表,递归法或者迭代法合并两条链表,然后逐一进行合并。
    这个过程中需要对链表数组进行遍历,由于for循环遍历+递归时间复杂度比较高,于是采用二分法递归分割链表数组,直到获得单条链表时返回,然后调用合并方法。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode(int x) { val = x; }
    7. * }
    8. */
    9. class Solution {
    10. public ListNode mergeKLists(ListNode[] lists) {
    11. if(lists == null || lists.length==0)return null;
    12. return helper(lists,0,lists.length-1);
    13. }
    14. private ListNode helper(ListNode[] lists, int begin, int end) {
    15. if(begin==end) {
    16. return lists[begin];
    17. }
    18. int mid = begin+(end-begin)/2;
    19. ListNode left = helper(lists,begin,mid);
    20. ListNode right = helper(lists,mid+1,end);
    21. return merge2List(left,right);
    22. }
    23. public ListNode merge2List(ListNode l1,ListNode l2){
    24. if(l1==null){
    25. return l2;
    26. }
    27. if(l2==null){
    28. return l1;
    29. }
    30. if(l1.val < l2.val){
    31. l1.next = merge2List(l1.next,l2);
    32. return l1;
    33. }
    34. else{
    35. l2.next = merge2List(l1,l2.next);
    36. return l2;
    37. }
    38. }
    39. }