Solve 23: Merge K sorted lists

This commit is contained in:
Samuel Ortion 2025-03-01 09:43:02 +01:00
commit 522deb6f82
Signed by: sortion
GPG Key ID: 9B02406F8C4FB765
1 changed files with 100 additions and 0 deletions

View File

@ -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();
}