链表排序
2015-08-31 09:40
453 查看
可以用对数组进行排序的方法对链表进行排序,但由于链表有单向访问的特点所以用归并排序比较合理。
ListNode *Merge(ListNode *pre1, ListNode *pre2){
ListNode *fir = pre1 -> next;
ListNode *sec = pre2 -> next;
ListNode *result = new ListNode(-1);
ListNode *p = result;
while(fir != nullptr && sec != nullptr){
if(fir -> val < sec -> val){
p -> next = fir;
p = p -> next;
fir = fir -> next;
}else{
p -> next = sec;
p = p -> next;
sec = sec -> next;
}
}
if(fir == nullptr){
while(sec != nullptr){
p -> next = sec;
p = p -> next;
sec = sec -> next;
}
p -> next = nullptr;
}
if(sec == nullptr){
while(fir != nullptr){
p -> next = fir;
p = p -> next;
fir = fir -> next;
}
p -> next = nullptr;
}
return result;
}
ListNode *MergeSort(ListNode *head, ListNode *tail){
if(head == tail){
ListNode *result = new ListNode(-1);
result -> next = head;
head -> next = nullptr;
return result;
}
ListNode *mid = head;
ListNode *fast = head;
while(fast != tail && fast -> next != tail){
mid = mid -> next;
fast = fast -> next -> next;
}
ListNode *tmp = mid -> next;
ListNode *result1 = MergeSort(head, mid);
ListNode *result2 = MergeSort(tmp, tail);
return Merge(result1, result2);
}
ListNode *sortList(ListNode *head){
if(head == nullptr || head -> next == nullptr)
return head;
ListNode *tail = head;
while(tail -> next != nullptr)
tail = tail -> next;
ListNode *result = MergeSort(head, tail);
return result -> next;
}
ListNode *Merge(ListNode *pre1, ListNode *pre2){
ListNode *fir = pre1 -> next;
ListNode *sec = pre2 -> next;
ListNode *result = new ListNode(-1);
ListNode *p = result;
while(fir != nullptr && sec != nullptr){
if(fir -> val < sec -> val){
p -> next = fir;
p = p -> next;
fir = fir -> next;
}else{
p -> next = sec;
p = p -> next;
sec = sec -> next;
}
}
if(fir == nullptr){
while(sec != nullptr){
p -> next = sec;
p = p -> next;
sec = sec -> next;
}
p -> next = nullptr;
}
if(sec == nullptr){
while(fir != nullptr){
p -> next = fir;
p = p -> next;
fir = fir -> next;
}
p -> next = nullptr;
}
return result;
}
ListNode *MergeSort(ListNode *head, ListNode *tail){
if(head == tail){
ListNode *result = new ListNode(-1);
result -> next = head;
head -> next = nullptr;
return result;
}
ListNode *mid = head;
ListNode *fast = head;
while(fast != tail && fast -> next != tail){
mid = mid -> next;
fast = fast -> next -> next;
}
ListNode *tmp = mid -> next;
ListNode *result1 = MergeSort(head, mid);
ListNode *result2 = MergeSort(tmp, tail);
return Merge(result1, result2);
}
ListNode *sortList(ListNode *head){
if(head == nullptr || head -> next == nullptr)
return head;
ListNode *tail = head;
while(tail -> next != nullptr)
tail = tail -> next;
ListNode *result = MergeSort(head, tail);
return result -> next;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- android 代码实现控件之间的间距
- [C/C++]反转链表
- [Android]在代码里运行另一个程序的方法
- 关于指针的一些事情
- 肯特·贝克:改变人生的代码整理魔法
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 网页恶意代码的预防
- 文件遍历排序函数
- 高手写的Tracer-Flash代码调试类代码下载
- C#实现基于链表的内存记事本实例
- C#选择排序法实例分析
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua中编译执行代码相关的函数详解
- Lua教程(一):在C++中嵌入Lua脚本