主要思路:
1 如果为NULL或者只有一个节点那么直接返回;
2 将链表分成两部分,分别进行排序,形成两个有序链表;
3 将两个有序链表合并;
void merge_sort(struct Node **list)
{
struct Node *p = *list;
struct Node *left = NULL;
struct Node *right = NULL;
if (p == NULL || p->next == NULL)
return ;
split(p, &left, &right);
merge_sort(&left);
merge_sort(&right);
*list = mergeSortedLink(left, right);
}
void split(struct Node *head, struct Node **listA, struct Node **listB)
{
if (head == NULL || head->next == NULL) {
*listA = head;;
*listB = NULL;
return ;
}
struct Node *p = head;;
struct Node *pfast = p->next;
while (pfast->next != NULL) {
pfast = pfast->next;
if (pfast->next != NULL) {
pfast = pfast->next;
p = p->next;
}
}
*listA = head;
*listB = p->next;
p->next = NULL;
}
struct Node *mergeSortedLink(struct Node *listA, struct Node *listB)
{
struct Node *head = NULL;
struct Node *tail = NULL;
if (listA == NULL) {
head = listB;
} else if (listB == NULL) {
head = listA;
} else {
while (listA != NULL && listB != NULL) {
if (listA->data < listB->data) {
if (head == NULL) {
head = listA;
tail = listA;
} else {
tail->next = listA;
tail = listA;
}
listA = listA->next;
} else {
if (head == NULL) {
head = listB;
tail = listB;
}else {
tail->next = listB;
tail = listB;
}
listB = listB->next;
}
}
if (listA != NULL) {
tail->next = listA;
}
if (listB != NULL) {
tail->next = listB;
}
}
return head;
}