【leetcode 单链表归并排序】Sort List
来源:互联网 发布:淘宝9.9包邮促销区 编辑:程序博客网 时间:2024/06/09 19:02
1、题目
Sort a linked list in O(n log n) time using constant space complexity.
OJ地址:https://oj.leetcode.com/problems/sort-list/
2、分析
题目要求时间复杂度为O(nlogn),空间复杂度为O(1),满足要求的排序算法有快速排序,归并排序,堆排序.....
一般来说,单链表排序用归并,双链表排序用快排,代码比较容易写。
本题是单链表,用归并会比较容易,并且利用了另一道题Merge Two Sorted Lists的代码,见我的另一篇笔记:http://blog.csdn.net/u012162613/article/details/40904163
3、归并排序代码
<span style="font-size:18px;">/** * 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) { if(!head || !head->next) return head; //空或者只有一个元素,直接return ListNode dummy(-1);dummy.next=head; ListNode *pslow=&dummy,*pfast=&dummy;//快慢指针,找出链表的中间节点,然后对左右两个子链表递归地调用归并排序 while(pfast&&pfast->next) { pslow=pslow->next; pfast=pfast->next->next; } ListNode *right_begin=pslow->next; pslow->next=nullptr; //断开两段子链表 ListNode *l1=sortList(dummy.next); ListNode *l2=sortList(right_begin); return mergeTwoLists(l1,l2); }private: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode dummy(-1); ListNode *head1=l1,*head2=l2,*tail=&dummy; while(head1!=nullptr && head2!=nullptr) { if(head1->val<head2->val) {tail->next=head1;head1=head1->next;} else {tail->next=head2;head2=head2->next;} tail=tail->next; } if(head1==nullptr) tail->next=head2; if(head2==nullptr) tail->next=head1; return dummy.next; } };</span>
4、快速排序代码(有bug)
我试着写成快排,处理起来很繁琐,凌乱,代码难看,我都不知道自己在写什么........最后不知道哪里有bug,调到不想调
<span style="font-size:18px;">/** * 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) { if(!head) return head; ListNode *tail=head; while(tail->next) tail=tail->next; return quicksort(head,tail); }private: ListNode *quicksort(ListNode *head,ListNode *mid) { if(head==mid) return head; ListNode dummy(-1);dummy.next=head; ListNode *i=&dummy,*j=dummy.next,*pre_j=&dummy; while(j!=mid) { if(j->val>=mid->val) {pre_j=j;j=j->next;} else { ListNode *inext=i->next; ListNode *inextnext=inext->next; ListNode *jnext=j->next; i->next=j; j->next=inextnext; pre_j->next=inext; inext->next=jnext; i=i->next; pre_j=j; j=j->next; } } if(i->next==mid) {quicksort(dummy.next,i);} else { pre_j->next=mid->next; mid->next=i->next; i->next=mid; if(i==&dummy) {quicksort(mid->next,pre_j);} else { quicksort(mid->next,pre_j); quicksort(dummy.next,i); } } return dummy.next; }};</span>
0 0
- Leetcode:Sort List 对单链表归并排序
- 【leetcode 单链表归并排序】Sort List
- 【LeetCode】 sort list 单链表的归并排序
- LeetCode Sort List(单链表归并排序)
- sort list leetcode (归并排序)
- Leetcode Sort List 链表归并排序
- [leetcode] 134 Sort List (链表 & 归并排序)
- Leetcode: Sort List - 归并
- 归并排序---Sort List
- leetcode:Sort List(链表的归并排序)
- [C++]LeetCode: 125 Sort List (归并排序链表)
- LeetCode Sort List 链表的归并排序
- leetcode:Sort List 使用归并排序的解决思路
- LeetCode 148. Sort List 解题报告(归并排序小结)
- leetcode 148. Sort List 链表归并排序
- 148. Sort List--单链表自底向上归并排序
- Leetcode 148 Sort List 单链表排序
- LeetCode Insertion Sort List(单链表插入排序)
- js判断所有表单项不为空则提交表单
- Atitit. Gui控件and面板----程序快速启动区--最佳实践Launchy ObjectDock-o0g
- Backbine.js实战第六章----视图
- 第四章 字符串和多为数组 思维导图
- Ubuntu 12.04.01 LTS 下ovs的安装与配置
- 【leetcode 单链表归并排序】Sort List
- VC设置监测内存泄露的方法
- 软件国际化之日期,数字,消息格式化
- Java异常处理
- 用Ant实现Java项目的自动构建和部署
- Java中Thread和runable的区别
- CocosEditor-java ListView显示
- 接口的内部类-内部类
- Atitit.故障排除系列-----apache 不能启动的排除