合并 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);
}
本文介绍了一种高效的算法,用于合并多个已排序的链表。通过使用分治策略,该算法能够在O(nlogk)的时间复杂度下完成任务,同时保持O(1)的空间复杂度。文章详细解释了算法的实现过程,并提供了具体的代码示例。
1026

被折叠的 条评论
为什么被折叠?



