[LeetCode] 148. Sort List 解题思路
2016-01-06 01:46
513 查看
Sort a linked list in O(n log n) time using constant space complexity.
问题:对一个单列表排序,要求时间复杂度为 O(n*logn),额外空间为 O(1)。
O(n*logn) 时间排序算法,无法是 quick sort, merge sort, head sort。quick sort 需要灵活访问前后元素,适合于数组,merge sort 只需要从左到右扫过去即可,可用于列表结构。
当列表元素个数大于2时,将列表拆分为左右对半的两个子列表,对左右子列表分别排序,然后合并。
当列表元素个数小于等于2 时,直接对列表元素比较排序。
第一步中的合并操作,实际上另一个LeetCode题目 Merge Two Sorted Lists
需要注意的是,由于是单向列表,为了方便操作元素位置,每次比较操作比较的是指针的下一个元素,详情见 sortmerge 函数。
参考资料:
[LeetCode] Sort List, Solution, 水中的鱼
问题:对一个单列表排序,要求时间复杂度为 O(n*logn),额外空间为 O(1)。
O(n*logn) 时间排序算法,无法是 quick sort, merge sort, head sort。quick sort 需要灵活访问前后元素,适合于数组,merge sort 只需要从左到右扫过去即可,可用于列表结构。
当列表元素个数大于2时,将列表拆分为左右对半的两个子列表,对左右子列表分别排序,然后合并。
当列表元素个数小于等于2 时,直接对列表元素比较排序。
第一步中的合并操作,实际上另一个LeetCode题目 Merge Two Sorted Lists
需要注意的是,由于是单向列表,为了方便操作元素位置,每次比较操作比较的是指针的下一个元素,详情见 sortmerge 函数。
/** * p 表示父节点 * ll, lr 分别表示左半列表的父节点,右半列表的父节点 * */ ListNode* sortmerge(ListNode* p, int len){ if (len <= 1) { return p; } if (len == 2) { if (p->next->val > p->next->next->val) { int tmp = p->next->val; p->next->val = p->next->next->val; p->next->next->val = tmp; } return p; } int lenL = len / 2; int lenR = len - lenL; ListNode* ll = p; ll = sortmerge(ll, lenL); ListNode* lr = p; for (int i = 0 ; i < lenL; i++) { lr = lr->next; } lr = sortmerge(lr, lenR); while (ll != lr && lenR > 0) { if (ll->next->val <= lr->next->val) { ll = ll->next; }else{ ListNode* next2 = lr->next; lr->next = lr->next->next; next2->next = ll->next; ll->next = next2; lenR--; } } return p; } ListNode* sortList(ListNode* head) { ListNode* node = head; int cnt = 0; while (node != NULL) { cnt++; node = node->next; } ListNode* p = new ListNode(0); p->next = head; p = sortmerge(p, cnt); head = p->next; return head; }
参考资料:
[LeetCode] Sort List, Solution, 水中的鱼
相关文章推荐
- C++ ABI之名字改变,编译器生成符号研究(以Qt为例)
- mTCP 和 DPDK 构造百万千万并发TCP连接
- ros论坛
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- exit() 函数输出一条消息,并退出当前脚本。 该函数是 die() 函数的别名。
- 每日一句
- LeetCode: 011 - Roman to Integer
- Nginx 替换WEBRICK
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
- wchar_t是内置还是别名(亲测有效:wchar_t在windows下是16位整数的别名,在linux等平台下是32位整数的别名。MSVC2008开始默认是/Zc:wchar_t)
- Jenkins入门系列之
- Convert int/long to hex string.
- Mingw GCC pack Struct.
- HTML中input type="text"和type="password" 显示的长度不一样
- poj 2337 之 有向图 欧拉路径输出
- 将无序数列升序排列,并输出排列结果和排列后的下标
- [看书日记20160106]Activity的Flags , IntentFilter ,Android的消息机制
- HDU 1177."Accepted today?"【结构体排序(水)】【1月6】
- How MapReduce Works
- 静态分配和动态分配内存的区别