排序链表—leecode148
在 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相关推荐
- leetcode-23 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...
- leetcode--删除排序链表中的重复元素--python
文章目录 题目 题目详情 示例 解题代码 思路 代码 运行结果 最佳方案 题目 题目详情 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 输入: 1->1->2 输出 ...
- 刻意练习:LeetCode实战 -- Task12. 合并K个排序链表
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- 刻意练习:LeetCode实战 -- Task08.删除排序链表中的重复元素
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- LeetCode实战:排序链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Sort a link ...
- LeetCode实战:合并K个排序链表
题目英文 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexi ...
- [leetcode-JavaScript]---23、合并K个排序链表
题目 合并 k 个排序链表,返回合并后的排序链表 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4-& ...
- 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素每个元素只留下一个. 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3 ...
- 算法---删除排序链表中的重复元素 II
删除排序链表中的重复元素 II 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 .返回 已排序的链表 . 输入:head = [1,2,3,3,4,4,5] ...
最新文章
- struts2配置default-properties
- python的发展趋势图_用Python绘制趋势图
- 今日SGU 5.20
- jquery 让div滚动条自动滚动到最下面
- android进程守护 失效,保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 1...
- luogu P3802 小魔女帕琪
- excel转word后表格超出页面_妙招!Word和Execl“联姻”实现数据高效处理!
- 51单片机的矩阵键盘、跑马灯和呼吸灯设计
- 精通javascript学习笔记
- Ubuntu18.04版本安装ssh及连接ssh的常见问题
- esp8266 windows烧录问题
- 前端之JS事件events
- 学什么副业前景好?学一个什么副业比较好?自学副业有哪些?
- 数据分析案例-文本挖掘与中文文本的统计分析
- Graham扫描法求解二维凸包问题
- 时光里,我们都是赶路人
- python的小作业
- Linux 文件/目录管理
- Swagger 实战教程-姚海陆-专题视频课程
- NOIP 2015 Day1T3 斗地主
热门文章
- linux下什么文件不能修改,Linux和Unix下root也不能修改文件与目录的命令
- 7.1使用Request获取HTTP请求头
- Django Form -- 对单个表单的组合验证
- 自由群,外代数和泛包络代数
- 【深度学习系列】迁移学习Transfer Learning
- Qt的MDI中多个子窗口响应一个菜单事件的优雅实现(动态slot)
- Delphi中点击DBGrid某一行获得其详细数据方法
- ProE二次开发之VS2005+ProE Wildfire 4.0开发环境配置
- [网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
- iOS之性能优化·优化App界面的渲染与流畅度