Solve 23: Merge K sorted lists
This commit is contained in:
commit
522deb6f82
|
@ -0,0 +1,100 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "../includes/list.h"
|
||||
|
||||
struct ListNode *minimumList(struct ListNode **lists, int listSize, int *minimumListIndex);
|
||||
|
||||
/**
|
||||
* Definition for singly-linked list.
|
||||
* struct ListNode {
|
||||
* int val;
|
||||
* struct ListNode *next;
|
||||
* };
|
||||
*/
|
||||
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
|
||||
int minimumListIndex = 0;
|
||||
struct ListNode* first_node = minimumList(lists, listsSize, &minimumListIndex);
|
||||
if (first_node == NULL) {
|
||||
return NULL;
|
||||
} else {
|
||||
lists[minimumListIndex] = first_node->next;
|
||||
struct ListNode *next_node = mergeKLists(lists, listsSize);
|
||||
first_node->next = next_node;
|
||||
}
|
||||
return first_node;
|
||||
}
|
||||
|
||||
/** Find the list node with minimal value.
|
||||
*/
|
||||
struct ListNode *minimumList(struct ListNode** lists, int listsSize, int* minimumListIndex) {
|
||||
if (listsSize < 1) {
|
||||
return NULL;
|
||||
} else {
|
||||
struct ListNode *minimumNode = NULL;
|
||||
int i=0;
|
||||
do {
|
||||
minimumNode = lists[i];
|
||||
*minimumListIndex = i;
|
||||
i++;
|
||||
} while (i < listsSize && minimumNode == NULL);
|
||||
while (i < listsSize) {
|
||||
struct ListNode *node = lists[i];
|
||||
if (node != NULL && node->val < minimumNode->val) {
|
||||
minimumNode = node;
|
||||
*minimumListIndex = i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return minimumNode;
|
||||
}
|
||||
}
|
||||
|
||||
void test_1() {
|
||||
int listsSize = 3;
|
||||
struct ListNode *l1 = NULL;
|
||||
l1 = list_insert(l1, 1);
|
||||
l1 = list_insert(l1, 4);
|
||||
l1 = list_insert(l1, 5);
|
||||
struct ListNode *l2 = NULL;
|
||||
l2 = list_insert(l2, 1);
|
||||
l2 = list_insert(l2, 3);
|
||||
l2 = list_insert(l2, 4);
|
||||
struct ListNode *l3 = NULL;
|
||||
l3 = list_insert(l3, 2);
|
||||
l3 = list_insert(l3, 6);
|
||||
struct ListNode **lists = malloc(3 * sizeof(struct ListNode *));
|
||||
lists[0] = l1;
|
||||
lists[1] = l2;
|
||||
lists[2] = l3;
|
||||
struct ListNode *result_list = mergeKLists(lists, listsSize);
|
||||
if (result_list == NULL) {
|
||||
printf("aie\n");
|
||||
}
|
||||
list_print(result_list);
|
||||
list_clear(l1);
|
||||
list_clear(l2);
|
||||
list_clear(l3);
|
||||
}
|
||||
|
||||
void test_2() {
|
||||
struct ListNode **lists = NULL;
|
||||
struct ListNode *result_list = mergeKLists(lists, 0);
|
||||
list_print(result_list);
|
||||
list_clear(result_list);
|
||||
}
|
||||
|
||||
void test_3() {
|
||||
struct ListNode *empty_list = NULL;
|
||||
struct ListNode **lists = malloc(sizeof(struct ListNode *));
|
||||
lists[0] = empty_list;
|
||||
struct ListNode *result_list = mergeKLists(lists, 1);
|
||||
list_print(result_list);
|
||||
list_clear(result_list);
|
||||
}
|
||||
|
||||
int main() {
|
||||
test_1();
|
||||
test_2();
|
||||
test_3();
|
||||
}
|
Loading…
Reference in New Issue