Description
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
Solution 1(C++)
class Solution{
public:
ListNode* sortList(ListNode* head) {
if(head == nullptr || head->next == nullptr) return head;
ListNode* pre = head;
ListNode* slow = head;
ListNode* fast = head;
while(fast != nullptr && fast->next != nullptr){
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
pre->next = nullptr;
ListNode* nodeA = sortList(head);
ListNode* nodeB = sortList(slow);
return mergeList(nodeA, nodeB);
}
private:
ListNode* mergeList(ListNode* nodeA, ListNode* nodeB){
ListNode* top = new ListNode(0);
ListNode* node = top;
while(nodeA != nullptr && nodeB != nullptr){
if(nodeA->val < nodeB->val){
node->next = nodeA;
nodeA = nodeA->next;
}
else{
node->next = nodeB;
nodeB = nodeB->next;
}
node = node->next;
}
node->next = nodeA != nullptr ? nodeA : nodeB;
return top->next;
}
};
排序的相关总结
其他相关题目可参考:
算法整理可参考:
算法分析
这道题是链表排序,使用的是归并排序的方法。多的就不罗嗦了,记住这道题:链表排序,用的是归并排序的方法。
程序分析
自己可以动手多写几遍。