LeetCode -- Sort List
2015-09-21 22:18
218 查看
Question:
Sort a linked list in O(n log n) time using constant space complexity.
Analysis:
问题描述:在O(n log n)时间内用常数的空间复杂度,完成一个链表的排序。
思考:排序时间复杂度为O(n log n)的话,快排、堆排序、归并排序都是O(n log n),而冒泡排序、交换排序、选择排序都是O(n2),就这道题来讲,很容易相当应该使用归并排序。
之前做过一个题目合并两个已经排好序的链表,因此这里的思路是:递归+归并排序。每次将当前链表分成两部分,排序后合并成一个链表。(注意归并的结束条件)
Answer:
Sort a linked list in O(n log n) time using constant space complexity.
Analysis:
问题描述:在O(n log n)时间内用常数的空间复杂度,完成一个链表的排序。
思考:排序时间复杂度为O(n log n)的话,快排、堆排序、归并排序都是O(n log n),而冒泡排序、交换排序、选择排序都是O(n2),就这道题来讲,很容易相当应该使用归并排序。
之前做过一个题目合并两个已经排好序的链表,因此这里的思路是:递归+归并排序。每次将当前链表分成两部分,排序后合并成一个链表。(注意归并的结束条件)
Answer:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode sortList(ListNode head) { if(head == null || head.next == null) return head; ListNode slow = head, fast = head, firstList = head; while(fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; } ListNode secondList = slow.next; slow.next = null; ListNode first = null, second = null; while(firstList != secondList) { first = sortList(firstList); second = sortList(secondList); return mergeTwoLists(first, second); } return mergeTwoLists(first, second); } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode p1 = l1; ListNode p2 = l2; if(l1 == null && l2 == null) return null; if(l1 == null && l2 != null) return l2; if(l1 != null && l2 == null) return l1; ListNode fakeHead = new ListNode(0); ListNode p = fakeHead; while (p1 != null && p2 != null){ if (p1.val <= p2.val) { p.next = p1; p1 = p1.next; p = p.next; } else { p.next = p2; p2 = p2.next; p = p.next; } } if(p1 != null) p.next = p1; if(p2 != null) p.next = p2; return fakeHead.next; } }
相关文章推荐
- Qt Pro文件与Qt模块启用
- js捕捉回车事件
- 判断带环单链表问题
- 九、结构型模式之装饰、组合、外观、享元-----《大话设计模式》
- js捕捉回车事件
- 面试题20:顺时针打印矩阵
- int转byte
- CF 一个不知道题号的题。。 B. ShortestPath Query
- UVa 12468 - Zapping
- 获取文件名后缀的方法
- 选用 get 与 post 的一些建议
- 0920编译原理词法分析-22陈施恩
- 单行bash、shell、perl命令
- 2015第39周一
- (算法)变成1需要的最小步数
- 黑马程序员——IOS学习笔记(内存释放的原则)
- 项目23.6 前导0的数字
- IC卡、ID卡及车库蓝牙卡的复制说明!(小区的门禁系统)
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
- Spark修炼之道(进阶篇)——Spark入门到精通:第六节 Spark编程模型(三)