题目描述
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
出处
思路
归并排序即可。
代码
class Solution {
public:
ListNode* merge(ListNode *h1,ListNode *h2) {
ListNode *head = nullptr;
if(h1->val<h2->val){
head = h1;
h1=h1->next;
}
else{
head = h2;
h2=h2->next;
}
ListNode *rear = head;
while(h1&&h2){
if(h1->val<h2->val){
rear->next=h1;
h1=h1->next;
}
else{
rear->next=h2;
h2=h2->next;
}
rear=rear->next;
}
if(h1)rear->next=h1;
if(h2)rear->next=h2;
return head;
}
void two_sort(ListNode * head){
if(!head->next) return;
int t=head->val;
if(t>head->next->val){
head->val=head->next->val;
head->next->val=t;
}
}
ListNode* sortList(ListNode* head) {
if(!head||!head->next) return head;
if(!head->next->next){
two_sort(head);
return head;
}
vector<ListNode*> lists;
ListNode* p=head;
ListNode* q=head;
while(p){
lists.push_back(p);
q=p->next;
if(q){
p=q->next;
q->next=nullptr;//断链
}
else
p=nullptr;
}
for(auto l:lists){
two_sort(l);
}
int i=0,j=1;
while(j<lists.size()){
p=merge(lists[i],lists[j]);
lists.push_back(p);
i+=2;j+=2;
}
return p;
}
};