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

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

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

思路1:暴力解决,拿出来,再放回去

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {vector<int> temp;ListNode* h = head;while(h!=NULL){temp.push_back(h->val);h = h->next;}sort(temp.begin(),temp.end());ListNode* r = head;int i=0;while(r!=NULL){r->val = temp[i++];r = r->next;}return head;}
};

思路2:复杂度要求为nlog2n,能想到的就是快排,堆排,归并排序。快排要找到第n个数由于是链表只能顺序找,太慢了,所以pass;堆排的空间复杂度为O(n),pass,只剩下堆排了,利用快慢指针找到中间节点进行分段,合并利用合并两个有序链表的方法,前面有这道题,然后就是递归了。

class Solution {
public:ListNode* sortList(ListNode* head) {if(head == NULL || head->next == NULL)    //递归出口return head;ListNode* head1 = head;ListNode* head2 = getMiddle(head);head1 = sortList(head1);  //对前半段进行递归head2 = sortList(head2); //对后半段进行递归return merge(head1, head2);}//归并ListNode* merge(ListNode* head1, ListNode* head2){ListNode* dummyHead = new ListNode(-1);ListNode* cur = dummyHead;while(head1 != NULL && head2 != NULL){if(head1->val > head2->val){cur->next = head2;head2 =  head2->next;}else{cur->next = head1;head1 = head1->next;}cur = cur->next;}if(head1 == NULL)cur->next = head2;if(head2 == NULL)cur->next = head1;return dummyHead->next;}//获取链表中间位置,并将链表从中间分为两个链表ListNode* getMiddle(ListNode* head){//使用快慢节点方法寻找链表的中间节点ListNode *fast = head, *slow = head;while(fast->next != NULL && fast->next->next != NULL){slow = slow->next;fast = fast->next->next;}fast = slow;slow = slow->next;    //第二个链表的首节点fast->next = NULL;   //将原来的链表从中间断开return slow;   }
};

排序链表—leecode148相关推荐

  1. leetcode-23 合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...

  2. leetcode--删除排序链表中的重复元素--python

    文章目录 题目 题目详情 示例 解题代码 思路 代码 运行结果 最佳方案 题目 题目详情 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 输入: 1->1->2 输出 ...

  3. 刻意练习:LeetCode实战 -- Task12. 合并K个排序链表

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  4. 刻意练习:LeetCode实战 -- Task08.删除排序链表中的重复元素

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  5. LeetCode实战:排序链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Sort a link ...

  6. LeetCode实战:合并K个排序链表

    题目英文 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexi ...

  7. [leetcode-JavaScript]---23、合并K个排序链表

    题目 合并 k 个排序链表,返回合并后的排序链表 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4-& ...

  8. 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素每个元素只留下一个. 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3 ...

  9. 算法---删除排序链表中的重复元素 II

    删除排序链表中的重复元素 II 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 .返回 已排序的链表 . 输入:head = [1,2,3,3,4,4,5] ...

最新文章

  1. struts2配置default-properties
  2. python的发展趋势图_用Python绘制趋势图
  3. 今日SGU 5.20
  4. jquery 让div滚动条自动滚动到最下面
  5. android进程守护 失效,保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 1...
  6. luogu P3802 小魔女帕琪
  7. excel转word后表格超出页面_妙招!Word和Execl“联姻”实现数据高效处理!
  8. 51单片机的矩阵键盘、跑马灯和呼吸灯设计
  9. 精通javascript学习笔记
  10. Ubuntu18.04版本安装ssh及连接ssh的常见问题
  11. esp8266 windows烧录问题
  12. 前端之JS事件events
  13. 学什么副业前景好?学一个什么副业比较好?自学副业有哪些?
  14. 数据分析案例-文本挖掘与中文文本的统计分析
  15. Graham扫描法求解二维凸包问题
  16. 时光里,我们都是赶路人
  17. python的小作业
  18. Linux 文件/目录管理
  19. Swagger 实战教程-姚海陆-专题视频课程
  20. NOIP 2015 Day1T3 斗地主

热门文章

  1. linux下什么文件不能修改,Linux和Unix下root也不能修改文件与目录的命令
  2. 7.1使用Request获取HTTP请求头
  3. Django Form -- 对单个表单的组合验证
  4. 自由群,外代数和泛包络代数
  5. 【深度学习系列】迁移学习Transfer Learning
  6. Qt的MDI中多个子窗口响应一个菜单事件的优雅实现(动态slot)
  7. Delphi中点击DBGrid某一行获得其详细数据方法
  8. ProE二次开发之VS2005+ProE Wildfire 4.0开发环境配置
  9. [网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
  10. iOS之性能优化·优化App界面的渲染与流畅度