在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3 输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0 输出: -1->0->3->4->5
题目分析:对链表进行归并排序,首先,用快慢指针找到链表的中点,然后将链表切开,分别对左右两边进行排序,然后合并两个有序的链表。时间复杂度为O(nlgn)
代码展示:
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head || !head->next)
return head;
ListNode *slow = head,*fast = head;
while(fast->next && fast->next->next){
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next;
slow->next = NULL;
ListNode* p = sortList(head);
ListNode* q = sortList(fast);
ListNode* pHead = new ListNode(-1), *temp=pHead;
while(p||q){
if(!q || (p&&p->valval)){
temp->next = p;
p = p->next;
}
else{
temp->next = q;
q = q->next;
}
temp = temp->next;
}
return pHead->next;
}
};