链表排序中使用归并排序:归并排序不仅保持了它的 O( nlog(n) ) 的时间复杂度,而且它在数组排序中广受诟病的空间复杂度,在链表排序中从 O(n) 降低到 O( log(n) )。
对于单向链表的二路归并排序,首先是要找到链表的中间节点,将链表等分。我们可以使用快慢指针的方式找到链表的中间节点,即一个指针以一个步长移动,另一个指针使用两个步长移动,当快指针到结尾位置时,慢指针正好在中间位置。接下来是对两个链表进行归并排序。
源程序:
//filename : linklist.h
#ifndef __LINKLIST_H_H_
#define __LINKLIST_H_H_
struct LinkList{
struct LinkList *next;
int value;
};
extern struct LinkList *createLinkList(int num);
extern void printLinkList (struct LinkList *list);
extern struct LinkList *merge(struct LinkList *first, struct LinkList *second);
extern struct LinkList *mergeSort(struct LinkList *head);
#endif
源程序:
//filename: linklist.cpp
#include "linklist.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
/**
*创建一个带头