From 7e4e9b0859b871440bfa58c0e44e16e8418b7d63 Mon Sep 17 00:00:00 2001 From: begeekmyfriend Date: Wed, 16 Aug 2017 10:36:03 +0800 Subject: [PATCH] Merge two sorted lists Signed-off-by: begeekmyfriend --- 021_merge_two_sorted_lists/Makefile | 2 + 021_merge_two_sorted_lists/merge_lists.c | 56 ++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 021_merge_two_sorted_lists/Makefile create mode 100644 021_merge_two_sorted_lists/merge_lists.c diff --git a/021_merge_two_sorted_lists/Makefile b/021_merge_two_sorted_lists/Makefile new file mode 100644 index 0000000..9c7c9b0 --- /dev/null +++ b/021_merge_two_sorted_lists/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test merge_lists.c diff --git a/021_merge_two_sorted_lists/merge_lists.c b/021_merge_two_sorted_lists/merge_lists.c new file mode 100644 index 0000000..28ee2d3 --- /dev/null +++ b/021_merge_two_sorted_lists/merge_lists.c @@ -0,0 +1,56 @@ +#include +#include + +struct ListNode { + int val; + struct ListNode *next; +}; + +static struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) +{ + struct ListNode dummy, *tail = &dummy; + dummy.next = NULL; + + while (l1 != NULL || l2 != NULL) { + struct ListNode *node = malloc(sizeof(*node)); + node->next = NULL; + tail->next = node; + tail = node; + if (l1 != NULL) { + if (l2 != NULL) { + if (l1->val < l2->val) { + node->val = l1->val; + l1 = l1->next; + } else { + node->val = l2->val; + l2 = l2->next; + } + } else { + node->val = l1->val; + l1 = l1->next; + } + } else { + node->val = l2->val; + l2 = l2->next; + } + } + + return dummy.next; +} + +int main(int argc, char **argv) +{ + struct ListNode l1; + l1.val = 2; + l1.next = NULL; + struct ListNode l2; + l2.val = 1; + l2.next = NULL; + struct ListNode * list = mergeTwoLists(&l1, &l2); + while (list != NULL) { + printf("%d ", list->val); + list = list->next; + } + printf("\n"); + return 0; +}