LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序
2017-08-06 20:33
459 查看
Sort a linked list in O(n log n)
time using constant space complexity.
以下为递归执行流程,分别是2个结点和4个结点的情况
15 / 15 test cases passed.
Status: Accepted
Runtime: 8 ms
T(n) = O(nlogn)
time using constant space complexity.
package com.main; class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public class Main { public ListNode sortList(ListNode head) { if (head == null || head.next == null) { return head; } //平分结点,分成两个分支 ListNode cur = null, slow = head, fast = head; while (fast != null && fast.next != null) {//如果是奇数个结点,多出来的一个结点放在了后面的部分 cur = slow; slow = slow.next; fast = fast.next.next; } cur.next = null; //每个分支都要排序,然后按序合并 ListNode l1 = sortList(head); ListNode l2 = sortList(slow); //按序合并,子分支和大分支都在这里合并 return merge(l1, l2); }//sortList public ListNode merge(ListNode l1, ListNode l2) { ListNode res = new ListNode(0), p = res; while (l1 != null && l2 != null) { if (l1.val < l2.val) { res.val = l1.val; p.next = l1;//这一句别忘了 l1 = l1.next; } else { res.val = l2.val; p.next = l2; l2 = l2.next; } p = p.next; }//while if (l1 != null) { p.next = l1; } if (l2 != null) { // p.next = l2.next;不能是p.next = l2.next p.next = l2; } return res.next;// ListNode res = new ListNode(0)因为第一个结点是0,所以这里是 res.next,而不是res }//merge public static void main(String[] args) { ListNode A = new ListNode(6); A.next = new ListNode(2); A.next.next = new ListNode(4); A.next.next.next = new ListNode(3); A.next.next.next.next = new ListNode(5); Main main = new Main(); ListNode C = main.sortList(A); System.out.println(C); } }
以下为递归执行流程,分别是2个结点和4个结点的情况
15 / 15 test cases passed.
Status: Accepted
Runtime: 8 ms
T(n) = O(nlogn)
相关文章推荐
- LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)
- LeetCode 148. Sort List(链表排序)
- LeetCode 148. Sort List 单链表排序 Python Solution
- LeetCode Sort List 链表排序(规定 O(nlogn) )
- 对链表排序 要求时间 复杂度为 O(nlogn) 空间复杂度为常量
- Leetcode:148_Sort List | O(nlogn)链表排序 | Medium
- [LeetCode] 148. Sort List 链表排序
- leetcode之时间复杂度为O(nlogn)的链表排序
- 在O(n log n)时间内使用常数空间复杂度对链表进行排序
- LeetCode 148.Sort List 链表排序
- 排序总结-时间复杂度和空间复杂度
- LeetCode Insertion Sort List 链表插入排序
- 链表的排序 时间复杂度O(nlogn)
- leetcode 148. Sort List 链表归并排序
- Sort List 链表排序@LeetCode
- Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法
- 排序1,2......n的无序数组,时间复杂度为o(n),空间复杂度为o(1)
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- [Leetcode] Sort list 对链表进行排序
- leetcode解题之148. Sort List Java版(对链表排序)