C语言链表的归并排序,测试入口:【洛谷】:P1177 【模板】排序
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node *next;
} Node, *List;
List create(int val) {
List p = (List) malloc(sizeof(Node));
p->val = val;
p->next = NULL;
return p;
}
List merge_sort(List list) {
if (list == NULL || list->next == NULL) return list;
List head, mid, tail;
head = mid = tail = list;
List result = NULL;
int flag = -1;
while (1) {
tail = tail->next;
if (!tail) break;
if (flag == 1) mid = mid->next;
flag *= -1;
}
List right = mid->next;
mid->next = NULL;
head = merge_sort(head);
right = merge_sort(right);
List p = head, q = right, r = NULL;
while (p && q) {
List s;
if (p->val < q->val) {
s = p;
p = p->next;
} else {
s = q;
q = q->next;
}
if (result) r->next = s;
else result = s;
r = s;
}
if (result) r->next = p ? p : q;
else result = p ? p : q;
return result;
}
int main() {
int n, x;
scanf("%d", &n);
List head = NULL;
List q = NULL;
while (n--) {
scanf("%d", &x);
List p = create(x);
if (head) {
q->next = p;
} else {
q = head = p;
}
q = p;
}
head = merge_sort(head);
for (List p = head; p; p = p->next) {
printf("%d ", p->val);
}
return 0;
}