合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
tips: 分治,时间复杂度O(nlogk), 空间复杂度O(1)
struct ListNode* mergeTwoListNode(struct ListNode* list_a,struct ListNode* list_b) {
struct ListNode* head,*p_node;
struct ListNode* node_a=list_a;
struct ListNode* node_b=list_b;
if(list_a==NULL) {
return list_b;
}
if(list_b==NULL) {
return list_a;
}
if(list_a->val<list_b->val) {
head=list_a;
node_a=node_a->next;
} else {
head = list_b;
node_b = node_b->next;
}
p_node=head;
while (node_a!=NULL||node_b!=NULL)
{
if(node_a==NULL) {
p_node->next=node_b;
break;
} else if(node_b==NULL) {
p_node->next=node_a;
break;
}
if(node_a->val > node_b->val) {
p_node->next = node_b;
node_b=node_b->next;
p_node=p_node->next;
} else {
p_node->next = node_a;
node_a=node_a->next;
p_node=p_node->next;
}
}
return head;
}
struct ListNode* binaryMergeList(struct ListNode** lists,int start, int end) {
if(start>end) {
return NULL;
} else if(start==end) {
return lists[start];
}
int mid = (start+end)/2;
struct ListNode* left_list=binaryMergeList(lists,start,mid);
struct ListNode* right_list=binaryMergeList(lists,mid+1,end);
return mergeTwoListNode(left_list,right_list);
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
return binaryMergeList(lists,0,listsSize-1);
}