Skip to content

Commit

Permalink
Merge K sorted lists
Browse files Browse the repository at this point in the history
Signed-off-by: begeekmyfriend <[email protected]>
  • Loading branch information
begeekmyfriend committed Jul 17, 2017
1 parent 620015e commit 7704a64
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
2 changes: 2 additions & 0 deletions 023_merge_k_sorted_lists/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
all:
gcc -O2 -o test merge_lists.c
91 changes: 91 additions & 0 deletions 023_merge_k_sorted_lists/merge_lists.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

struct ListNode {
int val;
struct ListNode *next;
};

struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
if (listsSize == 0) {
return NULL;
}
if (listsSize == 1) {
return lists[0];
}

int i, index;
struct ListNode dummy, *p, *prev;

dummy.next = NULL;
prev = &dummy;
index = 0;
while (index != -1) {
int min = INT_MAX;
index = -1;
for (i = 0; i < listsSize; i++) {
if (lists[i] != NULL && lists[i]->val < min) {
min = lists[i]->val;
index = i;
}
}

if (index != -1) {
p = malloc(sizeof(*p));
p->val = min;
p->next = NULL;
prev->next = p;
prev = p;
lists[index] = lists[index]->next;
}
}

return dummy.next;
}

int main(void)
{
int i, size;
struct ListNode *p, *prev, *sorted, dummy1, dummy2, **lists;

dummy1.next = NULL;
prev = &dummy1;
for (i = 0; i < 3; i++) {
p = malloc(sizeof(*p));
p->val = i * 2;
p->next = NULL;
prev->next = p;
prev = p;
}
for (p = dummy1.next; p != NULL; p = p->next) {
printf("%d ", p->val);
}
putchar('\n');

dummy2.next = NULL;
prev = &dummy2;
for (i = 0; i < 5; i++) {
p = malloc(sizeof(*p));
p->val = i * 2 + 1;
p->next = NULL;
prev->next = p;
prev = p;
}
for (p = dummy2.next; p != NULL; p = p->next) {
printf("%d ", p->val);
}
putchar('\n');

size = 2;
lists = malloc(size * sizeof(struct ListNode *));
lists[0] = NULL;//dummy1.next;
lists[1] = NULL;//dummy2.next;
sorted = mergeKLists(lists, size);
for (p = sorted; p != NULL; p = p->next) {
printf("%d ", p->val);
}
putchar('\n');

return 0;
}

0 comments on commit 7704a64

Please sign in to comment.