Skip to content

Commit

Permalink
Sort list
Browse files Browse the repository at this point in the history
Signed-off-by: Leo Ma <[email protected]>
  • Loading branch information
begeekmyfriend committed Oct 13, 2017
1 parent b4586a3 commit 466fade
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
2 changes: 2 additions & 0 deletions 148_sort_list/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
all:
gcc -O2 -o test sort_list.c
68 changes: 68 additions & 0 deletions 148_sort_list/sort_list.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include <stdio.h>
#include <stdlib.h>

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

static void recursive(struct ListNode *dummy, struct ListNode *end)
{
if (dummy == NULL || dummy->next == end) {
return;
}

struct ListNode *pivot = dummy->next;
struct ListNode *prev = pivot;
struct ListNode *p = pivot->next;
struct ListNode *first = NULL;

while (p != end) {
if (p->val >= pivot->val) {
if (first == NULL && p->val > pivot->val) {
first = prev;
}
prev = p;
p = p->next;
} else {
prev->next = p->next;
p->next = dummy->next;
dummy->next = p;
p = prev->next;
}
}

recursive(dummy, pivot);
recursive(first, end);
}

static struct ListNode *sortList(struct ListNode *head)
{
struct ListNode dummy;
dummy.next = head;
recursive(&dummy, NULL);
return dummy.next;
}

int main(int argc, char **argv)
{
int i, count = argc - 1;
struct ListNode *head = NULL, *p, *prev;
for (i = 0; i < count; i++) {
p = malloc(sizeof(*p));
p->val = atoi(argv[i + 1]);
p->next = NULL;
if (head == NULL) {
head = p;
} else {
prev->next = p;
}
prev = p;
}

for (p = sortList(head); p != NULL; p = p->next) {
printf("%d ", p->val);
}
printf("\n");
return 0;
}

0 comments on commit 466fade

Please sign in to comment.