1、题目描述
输入一个链表。对其排序。时间复杂度O(nlogn),常数的空间复杂度。
2、思路
归并排序。链表中间砍半。分别排序。再将其融合。
3、代码
ListNode* sortList(ListNode* head) {
if(!head||!head->next) return head;
ListNode* p =head;
ListNode* q = head->next;
while(q&&q->next){
p=p->next;
q=q->next->next;
}
q=p->next;
p->next = NULL;
head = sortList(head);
q = sortList(q);
ListNode* r = new ListNode(-1);
ListNode* ans = r;
while(head&&q){
if(head->val <= q->val){
r->next = head;
head=head->next;
}
else{
r->next = q;
q=q->next;
}
r=r->next;
}
if(head) r->next = head;
if(q) r->next = q;
return ans->next;
}