题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
想法是每两个链表都先进行合并,然后合并后的链表再合并,直到最后只剩下一个链表就合并完成了
合并两个链表:
时间复杂度:O(n1+n2)
/**
* 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists(ListNode l1,ListNode l2){
ListNode head = new ListNode(-1);
ListNode p = head;
while (l1!=null&&l2!=null){
if (l1.val<l2.val){
p.next = l1;
l1 = l1.next;
}else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
//收尾工作
if (l1!=null){
p.next = l1;
}
if (l2!=null){
p.next = l2;
}
return head.next;
}
合并K个
时间复杂度:O(nlogn)
/**
* 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
* @param lists
* @return
*/
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length==0||lists==null){//处理特殊情况
return null;
}
int n = lists.length;
while (n>1){//当长度大于1的时候还可以继续合并
for (int i = 0; i < n/2; i++) {
lists[i] = mergeTwoLists(lists[i],lists[n-i-1]);//首尾合并放在数组前面
}
n = (n+1)/2;//加1是适应长度是奇数的情况
}
return lists[0];
}