因为链表是节点式存储,不能做到随机存储,但是对于两个有序链表之间的合并不需要额外的空间,在O(1)空间复杂度O(n)时间复杂度内即可完成。所以对于链表排序,使用归并排序比较划算。
typedef struct Node List; struct Node { int value; List* next; };
首先合并两个有序的链表:
/* 在合并的时候始终保持一个链表的节点插入另一个链表中 这里始终保证first是最终的链表,将second链表中的每一个节点逐步插入到first中 */ List* Merge(List* first,List* second) { List* head = NULL; List* current = NULL; if(first == NULL) return second; if(second == NULL) return first; if(first->value > second->value) { current = first; first = second; second = current; } head = first; current = first; first = first->next; //始终将second的节点插入到first链表中 while( first != NULL && second != NULL) { List* temp = NULL; if(first->value > second->value) { temp = second->next; current->next = second; second->next = first; current = second; second = temp; } else { current = first; first = first->next; } } if(first == NULL) current->next = second; return head; }
链表归并排序的主要框架代码:
int List_length(List* list) { int len=0; List* temp = NULL; temp= list; while(temp != NULL) { len++; temp = temp->next; } return len; } List* MergeSort(List* list,int size) { if(size == 0 || size == 1) return list; List* middle = list; int i; for(i=1;i<size/2;i++) middle = middle->next; List* temp = middle->next; middle->next = NULL; middle = temp; List* left = MergeSort(list,i); List* right = MergeSort(middle,size-i); return Merge(right ,left); }
原文地址:http://blog.csdn.net/yusiguyuan/article/details/42713251