Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
Reference Answer
思路分析
常见排序方法有很多,插入排序,选择排序,堆排序,快速排序,冒泡排序,归并排序,桶排序等等。。它们的时间复杂度不尽相同,而这里题目限定了时间必须为O(nlgn),符合要求只有快速排序,归并排序,堆排序,而根据单链表的特点,最适于用归并排序。
Code
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
pre, slow, fast = head, head, head
while fast and fast.next:
pre = slow
slow = slow.next
fast = fast.next.next
pre.next = None
l1 = self.sortList(head)
l2 = self.sortList(slow)
return self.mergeLists(l1, l2)
def mergeLists(self, l1, l2):
if not l1:
return l2
if not l2:
return l1
root = ListNode(0)
head = root
while l1 and l2:
if l1.val < l2.val:
root.next = l1
l1 = l1.next
else:
root.next = l2
l2 = l2.next
root = root.next
root.next = l1 if l1 else l2
return head.next
C++ Version
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head || !head->next){
return head;
}
ListNode *pre = head;
ListNode *slow = head;
ListNode *fast = head;
while (fast && fast->next){
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
pre->next = NULL;
ListNode *l1 = sortList(head);
ListNode *l2 = sortList(slow);
return mergeList(l1, l2);
}
ListNode* mergeList(ListNode* l1, ListNode* l2){
if (!l1){
return l2;
}
if (!l2){
return l1;
}
ListNode *root = new ListNode(0);
ListNode *head = root;
while (l1 && l2){
if (l1->val < l2->val){
root->next = l1;
l1 = l1->next;
}
else{
root->next = l2;
l2 = l2->next;
}
root = root->next;
}
root->next = (NULL != l1)? l1 : l2;
return head->next;
}
};
Note
- 归并排序的思想意义重大,不仅用在数组排序上也可以用在其他的链表排序及回溯程序中,主要领会其精髓(二分+合并)!