题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
题目大意
合并 K 个有序链表
解题思路
思路:
递归,两两合并
遍历链表数组–>定义一个合并方法(21答案)
代码
public ListNode mergeKLists(ListNode[] lists) {
ListNode listNodeTemp = null;
if (lists != null) {
for (ListNode list :
lists) {
listNodeTemp = mergeTwoLists(list, listNodeTemp);
}
return listNodeTemp;
}
return null;
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
复杂度分析
时间复杂度:假设每个链表的最长长度是n。在第一次合并后, ans的长度为n ;第二次合并后,ans的长度为 2n,第i 次合并后,ans的长度为in。第i次合并的时间代价是O(n+(i-1)n)=O(i*n) ,那么总的时间代价为 O(\sum_{i=1}^{k}(i\times k))=O(\frac{(1+k)k}{2}\times n)=O(k^{2}n),故渐进时间复杂度为 O(k^{2}n)。
空间复杂度:没有用到与 k 和 n 规模相关的辅助空间,故渐进空间复杂度为 O(1)。