题目链接

题目大意:对链表进行排序,要求时间复杂度是o(nlgn)。

法一:冒泡,不交换结点,而交换结点中的数值。超时了。代码如下:

  1. public ListNode sortList(ListNode head) {
  2. if(head == null || head.next == null) {
  3. return head;
  4. }
  5. ListNode cur = null, tail = null;
  6. cur = head;
  7. while(cur.next != tail) {
  8. while(cur.next != tail) {
  9. //其实这里交换的是两个相邻结点的值,并没有交换两个结点指针
  10. if(cur.val > cur.next.val) {
  11. int tmp = cur.val;
  12. cur.val = cur.next.val;
  13. cur.next.val = tmp;
  14. }
  15. cur = cur.next;
  16. }
  17. //每一趟排序都会把一个相对最大的数排到最后一个,所以这里要将tail置为cur,而不是一直是null
  18. tail = cur;//下一次遍历的尾结点是当前结点
  19. //每一趟都再次从头开始遍历
  20. cur = head;//遍历起始结点重置为头结点
  21. }
  22. return head;
  23. }

法二:归并,交换结点,利用尾插,谁小谁放在前面。代码如下(耗时7ms):

  1. public ListNode sortList(ListNode head) {
  2. if(head == null || head.next == null) {
  3. return head;
  4. }
  5. //划分成两个链表,由快慢指针得到。
  6. //最终slow会指向第二个链表的起始位置,fast会指向第二个链表的末尾,pre会指向第一个链表的末尾
  7. ListNode pre = null, slow = head, fast = head;
  8. while(fast != null && fast.next != null) {
  9. pre = slow;
  10. slow = slow.next;
  11. fast = fast.next.next;
  12. }
  13. //第一个链表的终结
  14. pre.next = null;
  15. //分别对两个链表进行排序
  16. //head是第一个链表的头,slow是第二个链表的头
  17. ListNode l1 = sortList(head);
  18. ListNode l2 = sortList(slow);
  19. //归并l1和l2
  20. return merge(l1, l2);
  21. }
  22. private static ListNode merge(ListNode l1, ListNode l2) {
  23. //l头节点初始化为0,返回的时候返回l.next即可,即不带头结点的指针
  24. ListNode l = new ListNode(0), p = l;
  25. while(l1 != null && l2 != null) {
  26. //尾插
  27. if(l1.val < l2.val) {
  28. p.next = l1;
  29. l1 = l1.next;
  30. }
  31. else {
  32. p.next = l2;
  33. l2 = l2.next;
  34. }
  35. p = p.next;
  36. }
  37. //如果还有结点,则直接放在其后即可
  38. if(l1 != null) {
  39. p.next = l1;
  40. }
  41. if(l2 != null) {
  42. p.next = l2;
  43. }
  44. return l.next;
  45. }

148.Sort List---链表排序(冒泡、归并)的更多相关文章

  1. [LeetCode] 148. Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...

  2. LeetCode 148 Sort List 链表上的归并排序和快速排序

    Sort a linked list in O(n log n) time using constant space complexity. 单链表排序----快排 & 归并排序 (1)归并排 ...

  3. [LeetCode] Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. 常见排序方法有很多,插入排序,选择排序,堆排序,快速排序, ...

  4. LeetCode Sort List 链表排序(规定 O(nlogn) )

    Status: AcceptedRuntime: 66 ms 题意:根据给出的单链表,用O(nlogn)的时间复杂度来排序.由时间复杂度想到快排.归并这两种排序.本次用的是归并排序.递归将链表的规模不 ...

  5. 148 Sort List 链表上的归并排序和快速排序

    在使用O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 详见:https://leetcode.com/problems/sort-list/description/ Java实 ...

  6. [LintCode] Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. Have you met this question in ...

  7. [LeetCode]148. Sort List链表归并排序

    要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O ...

  8. [LeetCode]147. Insertion Sort List链表排序

    插入排序的基本思想 把排好的放在一个新的变量中,每次拿出新的,排进去 这个新的变量要有超前节点,因为第一个节点可能会有变动 public ListNode insertionSortList(List ...

  9. sort 树 hash 排序

    STL 中 sort 函数用法简介 做 ACM 题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错. ST ...

随机推荐

  1. 51nod 1503 猪和回文(多线程DP)

    虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...

  2. Java虚拟机的内存管理----垃圾收集器

    1.Serial收集器 优点,是简单而高效,单线程避免了线程交互的开销. 缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程). 2.ParNew收集器 它是Serial收集器的多 ...

  3. MySQL慢查询日志ES索引模板

    { "template": "mysql-slow-log-*", "settings": { "index": { & ...

  4. Xor Sum HDU - 4825(01字典序板题)

    #include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...

  5. thusc2018酱油记

    day-1 打点行囊,从学校出发去火车站 day0 在火车上一觉醒来便快到了北京,直接前往了宾馆安置 下午报道,一脸向往地第一次走入清华园,感觉十分的梦幻,心里一直喃喃:"希望以后也能经常在 ...

  6. 20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

    回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录 ...

  7. 实现了一下Berlekamp-Massey

    //from https://www.cnblogs.com/TSHugh/p/9265155.html //在FP中求固定项数数列的线性递推式 //此递推式严格符合数学定义,故可能在末尾出现一些看起 ...

  8. 据说要写一个CTSC&APIO的收获

    就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...

  9. 在 Xamarin.Forms 实现密码输入EntryCell

    在 Xamarin.Forms 中,我们通常使用 TableView 来构建输入表单.Xamarin 为我们提供了 EntryCell 用于输入文本,但是其并不支持密码输入,即密码掩码.这里要对 En ...

  10. ppt述职摘要

    1.工作总结 1)做了什么 2)做的怎么样 3)还要做什么 2.个人成长和团队成长 3.个人目标和团队目标 1)时间+量化(具体说明) 2)预期效果 3)团队凝聚力 4.展望