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