148.Sort List---链表排序(冒泡、归并)
题目大意:对链表进行排序,要求时间复杂度是o(nlgn)。
法一:冒泡,不交换结点,而交换结点中的数值。超时了。代码如下:
- public ListNode sortList(ListNode head) {
- if(head == null || head.next == null) {
- return head;
- }
- ListNode cur = null, tail = null;
- cur = head;
- while(cur.next != tail) {
- while(cur.next != tail) {
- //其实这里交换的是两个相邻结点的值,并没有交换两个结点指针
- if(cur.val > cur.next.val) {
- int tmp = cur.val;
- cur.val = cur.next.val;
- cur.next.val = tmp;
- }
- cur = cur.next;
- }
- //每一趟排序都会把一个相对最大的数排到最后一个,所以这里要将tail置为cur,而不是一直是null
- tail = cur;//下一次遍历的尾结点是当前结点
- //每一趟都再次从头开始遍历
- cur = head;//遍历起始结点重置为头结点
- }
- return head;
- }
法二:归并,交换结点,利用尾插,谁小谁放在前面。代码如下(耗时7ms):
- public ListNode sortList(ListNode head) {
- if(head == null || head.next == null) {
- return head;
- }
- //划分成两个链表,由快慢指针得到。
- //最终slow会指向第二个链表的起始位置,fast会指向第二个链表的末尾,pre会指向第一个链表的末尾
- ListNode pre = null, slow = head, fast = head;
- while(fast != null && fast.next != null) {
- pre = slow;
- slow = slow.next;
- fast = fast.next.next;
- }
- //第一个链表的终结
- pre.next = null;
- //分别对两个链表进行排序
- //head是第一个链表的头,slow是第二个链表的头
- ListNode l1 = sortList(head);
- ListNode l2 = sortList(slow);
- //归并l1和l2
- return merge(l1, l2);
- }
- private static ListNode merge(ListNode l1, ListNode l2) {
- //l头节点初始化为0,返回的时候返回l.next即可,即不带头结点的指针
- ListNode l = new ListNode(0), p = l;
- while(l1 != null && l2 != null) {
- //尾插
- if(l1.val < l2.val) {
- p.next = l1;
- l1 = l1.next;
- }
- else {
- p.next = l2;
- l2 = l2.next;
- }
- p = p.next;
- }
- //如果还有结点,则直接放在其后即可
- if(l1 != null) {
- p.next = l1;
- }
- if(l2 != null) {
- p.next = l2;
- }
- return l.next;
- }
148.Sort List---链表排序(冒泡、归并)的更多相关文章
- [LeetCode] 148. Sort List 链表排序
Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...
- LeetCode 148 Sort List 链表上的归并排序和快速排序
Sort a linked list in O(n log n) time using constant space complexity. 单链表排序----快排 & 归并排序 (1)归并排 ...
- [LeetCode] Sort List 链表排序
Sort a linked list in O(n log n) time using constant space complexity. 常见排序方法有很多,插入排序,选择排序,堆排序,快速排序, ...
- LeetCode Sort List 链表排序(规定 O(nlogn) )
Status: AcceptedRuntime: 66 ms 题意:根据给出的单链表,用O(nlogn)的时间复杂度来排序.由时间复杂度想到快排.归并这两种排序.本次用的是归并排序.递归将链表的规模不 ...
- 148 Sort List 链表上的归并排序和快速排序
在使用O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 详见:https://leetcode.com/problems/sort-list/description/ Java实 ...
- [LintCode] Sort List 链表排序
Sort a linked list in O(n log n) time using constant space complexity. Have you met this question in ...
- [LeetCode]148. Sort List链表归并排序
要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O ...
- [LeetCode]147. Insertion Sort List链表排序
插入排序的基本思想 把排好的放在一个新的变量中,每次拿出新的,排进去 这个新的变量要有超前节点,因为第一个节点可能会有变动 public ListNode insertionSortList(List ...
- sort 树 hash 排序
STL 中 sort 函数用法简介 做 ACM 题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错. ST ...
随机推荐
- 51nod 1503 猪和回文(多线程DP)
虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...
- Java虚拟机的内存管理----垃圾收集器
1.Serial收集器 优点,是简单而高效,单线程避免了线程交互的开销. 缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程). 2.ParNew收集器 它是Serial收集器的多 ...
- MySQL慢查询日志ES索引模板
{ "template": "mysql-slow-log-*", "settings": { "index": { & ...
- Xor Sum HDU - 4825(01字典序板题)
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...
- thusc2018酱油记
day-1 打点行囊,从学校出发去火车站 day0 在火车上一觉醒来便快到了北京,直接前往了宾馆安置 下午报道,一脸向往地第一次走入清华园,感觉十分的梦幻,心里一直喃喃:"希望以后也能经常在 ...
- 20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程
回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录 ...
- 实现了一下Berlekamp-Massey
//from https://www.cnblogs.com/TSHugh/p/9265155.html //在FP中求固定项数数列的线性递推式 //此递推式严格符合数学定义,故可能在末尾出现一些看起 ...
- 据说要写一个CTSC&APIO的收获
就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...
- 在 Xamarin.Forms 实现密码输入EntryCell
在 Xamarin.Forms 中,我们通常使用 TableView 来构建输入表单.Xamarin 为我们提供了 EntryCell 用于输入文本,但是其并不支持密码输入,即密码掩码.这里要对 En ...
- ppt述职摘要
1.工作总结 1)做了什么 2)做的怎么样 3)还要做什么 2.个人成长和团队成长 3.个人目标和团队目标 1)时间+量化(具体说明) 2)预期效果 3)团队凝聚力 4.展望