一. 定义节点
struct node {
int data;
node* next;
node(int data = 0, node* next = NULL)
:data(data), next(next) {}
};
二. 归并排序主体结构
void mergesort(node*& head) {
if(head->next) {
node* mid = cut(head);
mergesort(head);
mergesort(mid);
head = merge(head, mid);
}
}
三. cut函数, 将一条链表从中间断开, 返回后一条链表的头
实现方法是: 让两个指针同时走, 其中一个是另一个的速度的两倍
node* cut(node*& head) {
node* p = head;
node* q = head;
node* second_head;
while(q && q->next) {
q = q->next;
if(q->next) {
p = p->next;)
q = q->next;
}
}
second_head = p->next;
p->next = NULL;
return second_head;
}
四. merge函数, 将两条有序(小到大的顺序)的链表按顺序合并(合并后也是有序的了)
算法: 两个指针分别指向两个链表的头, 每一次”取出”两个指针指向的节点当中值较小的节点, 再把那个指针后移, 这样一来取出来的节点就是按从小到大的顺序.
node* merge(node*& head, node*& mid) {
node tmp;
node *p = &tmp, *q = head, *t = mid;
while(q && t) {
if(q->data <= t->data) {
p->next = q;
p = p->next;
q = q->next;
}
else {
p->next = t;
p = p->next;
t = t->next;
}
}
if(q)
p->next = q;
else
p->next = t;
return tmp.next;
}
这样就实现了从小到大排序的归并排序的链表算法!