148. Sort List

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了148. Sort List相关的知识,希望对你有一定的参考价值。

总结:

常数空间且O(n*logn), 单链表适合使用归并排序,双向链表适合使用快排。

方法一:缺点是改变了原有链表的结构

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* sortList(ListNode* head) {
12         if (head == nullptr) return nullptr;
13         if (head->next == nullptr) return head;
14         int length = 0;
15         ListNode* ptr = head;
16         while (ptr != nullptr) {
17             ++length;
18             ptr = ptr->next;
19         }
20         return sortList(head, length);
21     }
22 private:
23     ListNode* sortList(ListNode* head, int length)
24     {
25         if (length == 0) return nullptr;
26         if (length == 1) return head;
27         else {
28             ListNode* rightHalf = head;
29             ListNode* leftTail = nullptr;
30             int count = length / 2;
31             while (count--) {
32                 leftTail = rightHalf;
33                 rightHalf = rightHalf->next;
34             }
35             leftTail->next = nullptr; // 这里改变了原有链表的结构
36             return mergeList(sortList(head, length / 2), sortList(rightHalf, length - length / 2));
37         }
38     }
39     
40     ListNode* mergeList(ListNode* ptr1, ListNode* ptr2) {
41         ListNode dummy(-1);
42         ListNode* ptr = &dummy;
43         while (ptr1 && ptr2) {
44             if (ptr1->val < ptr2->val) {
45                 ptr->next = ptr1;
46                 ptr1 = ptr1->next;
47             }
48             else {
49                 ptr->next = ptr2;
50                 ptr2 = ptr2->next;
51             }
52             ptr = ptr->next;
53         }
54         ptr->next = (ptr1 == nullptr) ? ptr2 : ptr1;
55         return dummy.next;
56     }
57 };

 

以上是关于148. Sort List的主要内容,如果未能解决你的问题,请参考以下文章

148. Sort List

[LeetCode] 148. Sort List

148. Sort List

[Lintcode]98. Sort List/[Leetcode]148. Sort List

148. Sort List

148. Sort List