Sort List 链表排序
来源:互联网 发布:山东大学网络教育好吗 编辑:程序博客网 时间:2024/06/02 17:55
Sort a linked list in O(n log n) time using constant space complexity.
----------------------------------------------------------------------------------------------------------------------------------------
这里,依旧利用分治的思想,更具体点就是归并排序的算法。
假设list 的前一半已经排好序的,后一半也已经排好序了,那么将这2 Merge起来(如果不知道怎么Merge,可以看我前面的博文)
那么具体list的前一半怎么排序呢?也是拆分成2部分。
现在我们需要解决的问题,如何将得到list的中间节点呢?不像数组有index,可以直接得到。
这里,又是two pointer,双指针了,一个slow指针一次走1步,一个fast指针一次走2步。
那么当fast碰到null的时候,slow就在中间部位了。
1. 我们先对后面的 slow.next 进行递归排序,得到L2。
2. 接着,我们将slow.next = null, 即从中间将原链表断开。
3.对前面部分进行递归排序,得到L1。
4. 最后将L1和L2 merge。
时间复杂度:O( n log n )
空间复杂度:O ( 1 )
运行时间:
代码:
public ListNode sortList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode fast = head.next, slow = head; while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; } ListNode l2 = sortList(slow.next); slow.next = null; ListNode l1 = sortList(head); return mergeTwoLists(l1, l2); } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode fakeNode = new ListNode(-1), cur = fakeNode, curl1 = l1, curl2 = l2; while (curl1 != null && curl2 != null) { if (curl1.val < curl2.val) { cur.next = curl1; curl1 = curl1.next; } else { cur.next = curl2; curl2 = curl2.next; } cur = cur.next; } cur.next = curl1 != null ? curl1 : curl2; return fakeNode.next; }
1 0
- 链表排序 Sort List
- Sort List 链表排序
- 链表排序(Sort List)
- Sort List 链表排序@LeetCode
- Leetcode Sort List 链表归并排序
- LeetCode Sort List(链表排序)
- Insertion Sort List 链表插入排序
- Insertion Sort List 链表插入排序
- 排序链表(Sort linked list)
- LeetCode-Sort List 链表排序
- Leetcode Sort List 链表排序
- Sort List 归并排序链表
- LeetCode Sort List(链表排序)
- 148. Sort List 链表归并排序
- [Lintcode]Sort List链表排序
- 148. Sort List 链表排序(C++)
- 【LeetCode】Sort List 链表排序- Medium ++(Merge&Quick Sort)
- LIST排序, Struct排序, qsort排序, STL::LIST sort排序, 链表排序
- TCP 通信
- Leetcode 3. Longest Substring Without Repeating Characters
- 【DRP】将SQL脚本导入Oracle数据库并进行数据初始化
- Leetcode-11. Container With Most Water
- malloc/free与 new/delete 内存的分配方式 多态类中的虚函数表 全局变量和局部变量
- Sort List 链表排序
- elasticsearch集群生态介绍,分片及其水平扩展
- django+celery+djcelery 最简配置
- unzip命令
- 从浏览器输入地址按下Enter键到网页出现到底发生了什么?
- Unity3D研究院之IOS&Android收集Log文件
- 个人完成案例之乐学成语(显示学习列表和连接主界面)
- 如何添加AdMob广告到现有的Unity3D ios游戏
- Openlayers加载在线地图