From 522deb6f82e68596b8b4ea39153db840132a22e0 Mon Sep 17 00:00:00 2001 From: Samuel Ortion Date: Sat, 1 Mar 2025 09:43:02 +0100 Subject: [PATCH] Solve 23: Merge K sorted lists --- src/23.merge-k-sorted-lists.c | 100 ++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/23.merge-k-sorted-lists.c diff --git a/src/23.merge-k-sorted-lists.c b/src/23.merge-k-sorted-lists.c new file mode 100644 index 0000000..23ff4c2 --- /dev/null +++ b/src/23.merge-k-sorted-lists.c @@ -0,0 +1,100 @@ +#include +#include + +#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(); +}