Problem:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Analysis:
Solutions:
C++:
bool TestListsValidity(const vector<ListNode*>& lists)
{
for(int i = 0; i < lists.size(); ++i) {
if(lists[i] != NULL)
return true;
}
return false;
}
ListNode *MergeTwoLists(ListNode *list_1, ListNode *list_2)
{
if(list_1 == NULL && list_2 == NULL)
return NULL;
if(list_1 != NULL && list_2 == NULL)
return list_1;
else if(list_1 == NULL && list_2 != NULL)
return list_2;
ListNode *p_merged_list_head = NULL;
ListNode *p_merged_list_tail = NULL;
while(list_1 != NULL && list_2 != NULL) {
ListNode *p_added_node = NULL;
if(list_1->val <= list_2->val) {
p_added_node = list_1;
list_1 = list_1->next;
p_added_node->next = NULL;
} else {
p_added_node = list_2;
list_2 = list_2->next;
p_added_node->next = NULL;
}
if(p_merged_list_tail == NULL) {
p_merged_list_head = p_added_node;
p_merged_list_tail = p_added_node;
} else {
p_merged_list_tail->next = p_added_node;
p_merged_list_tail = p_merged_list_tail->next;
}
}
if(list_1 != NULL) {
p_merged_list_tail->next = list_1;
list_1 = NULL;
} else if(list_2 != NULL) {
p_merged_list_tail->next = list_2;
list_2 = NULL;
}
return p_merged_list_head;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty() || !TestListsValidity(lists))
return NULL;
int size = lists.size();
for(int step = 1; step < size; step *= 2) {
for(int i = 0; i < size && i + step < size; i += 2 * step)
lists[i] = MergeTwoLists(lists[i], lists[i + step]);
}
return lists[0];
}
Java
:
Python: