合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解法:类似于合并两个链表,递归法或者迭代法合并两条链表,然后逐一进行合并。
这个过程中需要对链表数组进行遍历,由于for循环遍历+递归时间复杂度比较高,于是采用二分法递归分割链表数组,直到获得单条链表时返回,然后调用合并方法。
/*** 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 == null || lists.length==0)return null;return helper(lists,0,lists.length-1);}private ListNode helper(ListNode[] lists, int begin, int end) {if(begin==end) {return lists[begin];}int mid = begin+(end-begin)/2;ListNode left = helper(lists,begin,mid);ListNode right = helper(lists,mid+1,end);return merge2List(left,right);}public ListNode merge2List(ListNode l1,ListNode l2){if(l1==null){return l2;}if(l2==null){return l1;}if(l1.val < l2.val){l1.next = merge2List(l1.next,l2);return l1;}else{l2.next = merge2List(l1,l2.next);return l2;}}}
