
【Lintcode】98. Sort List
发布日期:2021-05-03 18:44:37
浏览次数:22
分类:精选文章
本文共 2093 字,大约阅读时间需要 6 分钟。
题目地址:
排序一个链表。
由于链表无法random access,但用归并排序则不需要额外的空间(递归栈空间除外),所以可以用归并排序来解决。具体来说就是,先找到链表的中点,然后将链表断开,分别递归排序两部分,接着将两部分merge起来即可。代码如下:
public class Solution { /** * @param head: The head of linked list. * @return: You should return the head of the sorted linked list, using constant space complexity. */ public ListNode sortList(ListNode head) { // write your code here // base case是链表为空或者只有一个节点。注意借助数学归纳法来考虑递归出口是什么 if (head == null || head.next == null) { return head; } ListNode mid = findMid(head); ListNode secondHalf = mid.next; mid.next = null; ListNode l1 = sortList(head), l2 = sortList(secondHalf); return merge(l1, l2); } private ListNode findMid(ListNode head) { if (head == null) { return null; } ListNode dummy = new ListNode(0); dummy.next = head; ListNode slow = dummy, fast = dummy; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return slow; } private ListNode merge(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0), prev = dummy; while (l1 != null || l2 != null) { if (l1 == null) { prev.next = l2; break; } else if (l2 == null) { prev.next = l1; break; } else { if (l1.val <= l2.val) { prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } } return dummy.next; }}class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn)(找中点需要 O ( n ) O(n) O(n),所以 T ( n ) = O ( n ) + 2 T ( n 2 ) T(n)=O(n) + 2T(\frac{n}{2}) T(n)=O(n)+2T(2n),再由主定理即得),空间 O ( log n ) O(\log n) O(logn)。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月11日 05时45分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
spring启动错误:Could not resolve placeholder
2021-05-08
invalid byte sequence for encoding
2021-05-08
技术美术面试问题整理
2021-05-08
ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】
2021-05-08
js求阶乘
2021-05-08
Nginx---惊群
2021-05-08
项目中常用的审计类型概述
2021-05-08
(九)实现页面底部购物车的样式
2021-05-08
python-day3 for语句完整使用
2021-05-08
基于LabVIEW的入门指南
2021-05-08
weblogic之cve-2015-4852
2021-05-08
Java注释
2021-05-08
C++ 函数重载
2021-05-08
使用mybatis-generator生成底层
2021-05-08
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2021-05-08
计算输入的一句英文语句中单词数
2021-05-08
lvs+keepalive构建高可用集群
2021-05-08
6 个 Linux 运维典型问题
2021-05-08