题目要求
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
题解
https://github.com/soulmachine/leetcode
常数空间且 O(nlogn),单链表适合用归并排序,双向链表适合用快速排序。本题可以复
用”Merge Two Sorted Lists” 的代码。
class Solution {
public:
ListNode* mergeTwoLists(ListNode *l1,ListNode *l2){
ListNode dummy(-1);
for(ListNode *p=&dummy;l1||l2;p=p->next){
int val1=l1==nullptr?INT_MAX:l1->val; //这里必须是判断l1==nullptr,不能直接l1
int val2=l2==nullptr?INT_MAX:l2->val;
if(val1<=val2){
p->next=l1;
l1=l1->next;
}else{
p->next=l2;
l2=l2->next;
}
}
return dummy.next;
}
ListNode* sortList(ListNode* head) {
if(!head||!head->next) return head;
//快慢指针找中间节点
ListNode *fast=head,*slow=head;
while(fast->next&&fast->next->next){
slow=slow->next;
fast=fast->next->next;
}
//断开
fast=slow;
slow=slow->next;
fast->next=nullptr;
ListNode *l1=sortList(head);
ListNode *l2=sortList(slow);
return mergeTwoLists(l1,l2);
}
};