链表排序
来源:互联网 发布:常见浏览器js兼容问题 编辑:程序博客网 时间:2024/05/24 00:14
可以用对数组进行排序的方法对链表进行排序,但由于链表有单向访问的特点所以用归并排序比较合理。
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; }
0 0
- 链表排序 归并排序
- 链表排序--选择排序
- 链表排序--快速排序
- 链表排序--归并排序
- 排序3:插入排序(普通插入排序 + 折半插入排序 + 链表插入排序 + 希尔排序)
- LIST排序, Struct排序, qsort排序, STL::LIST sort排序, 链表排序
- 单向链表排序:快速排序和归并排序
- 单向链表排序-归并排序
- 链表排序,使用插入排序,
- 链表排序-直接插入排序
- 链表的一种排序---冒泡排序
- c 链表排序 - 选择排序
- 链表排序之插入排序
- 插入排序进行链表排序
- 优化冒泡排序 & 链表选择排序
- 链表排序之选择排序
- 链表排序之冒泡排序
- 链表排序(归并排序)
- 2015-08-31 阅读摘要
- 常规功能和模块自定义系统(cfcmms)—005开发环境搭建和创建项目
- 性能学习
- 国务院关于积极推进“互联网+”行动的指导意见
- java并发容器分析
- 链表排序
- 分析appstore审核失败的真实案例及解决办法
- 面试题13:在O(1)时间删除链表节点
- JAVA问题总结之21--private使用实例和手动设置报错
- 软件生命周期中的攻防博弈
- Intent的几种有关Activity启动的方式有哪些?
- 三分钟理解“简单工厂模式”——设计模式轻松掌握
- 架构师之路(1)---面向过程和面向对象
- 类间的关系