题目

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3

输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0

输出: -1->0->3->4->5

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/sort-list

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

归并排序的递归实现。

在递归过程中:

- 若只有一个节点,直接返回

- 找到中点,分成左右两个链表

- 递归 左边链表

- 递归 右边链表

- 两路归并排序

- 返回排好序的链表

待做

归并排序的非递归实现

代码

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
return head == null ? null : merge(head);
} private ListNode merge(ListNode head) {// 归并排序
// 如果只剩一个节点,直接返回节点
if (head == null || head.next == null) {//
return head;
} // 找到链表中点
ListNode pSlow = head;
ListNode pFast = head;
ListNode pPre = null;
while (pFast != null && pFast.next != null) {
pPre = pSlow;
pFast = pFast.next.next;
pSlow = pSlow.next;
}
pPre.next = null;// 把中点与中点前的节点切断;
ListNode lList = merge(head);// 返回已排好序的左半边链表
ListNode rList = merge(pSlow);// 返回已排好序的右半边链表 //
ListNode sortList = mergeSort(lList, rList);// 对head的链表归并排序 //
return sortList;
} private ListNode mergeSort(ListNode l, ListNode r) {// 两路归并
ListNode dummyHead = new ListNode(-1);
ListNode cur = dummyHead; while (l != null && r != null) {
if (l.val <= r.val) {
cur.next = l;
l = l.next;
cur = cur.next;
} else {
cur.next = r;
r = r.next;
cur = cur.next;
}
}
if (l != null) {
cur.next = l;
}
if (r != null) {
cur.next = r;
}
return dummyHead.next;
}
}

最新文章

  1. Theano printing
  2. 关于TCP中的MSS
  3. ***HTML +CSS 总结与归纳
  4. 如何防止JAVA反射对单例类的攻击?
  5. Atitit 图像扫描器---基于扫描线
  6. eclipse无法导入Android工程的现象与解决办法
  7. 通过一段代码说明C#中rel与out的使用区别
  8. iOS ARC基本原理
  9. 解决session失效之后登陆后重新返回之前的页面
  10. eclipse配置maven + 创建maven项目
  11. webstorm安装与本地激活
  12. C语言指针的那些坑
  13. 通过PING命令中的TTL来判断对方操作系统
  14. Python之配置模块ConfigParser
  15. HDU 3094 A tree game
  16. clang如何获得程序控制流图
  17. DBLookupCombobox实现下拉联动
  18. loading加载动画效果js实现
  19. nginx rate limit
  20. MySQL学习(九)

热门文章

  1. MSF常用命令备忘录
  2. C# NPOI计算Execl里面的公式
  3. 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
  4. 【数论】莫比乌斯反演Mobius inversion
  5. unity探索者之复制内容到剪贴板
  6. Dbeaver连接Hive和Mysql的配置
  7. Flutter FlatButton 按钮基本各种用法
  8. kvm 虚拟机中鼠标不同步的问题解决方法
  9. Java中实现对集合中对象按中文首字母排序
  10. 怎么创建一个良好的Git提交信息