给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
输入:head = [4,2,1,3] 输出:[1,2,3,4]
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeList(ListNode* list1, ListNode* list2){
ListNode* p = list1;
ListNode* q = list2;
ListNode* dummy = new ListNode(0);
ListNode* res = dummy;
while(p && q){
if(p->val < q->val){
res->next = p;
p = p->next;
res = res->next;
}else{
res->next = q;
q = q->next;
res = res->next;
}
}
if(p)
res->next = p;
if(q)
res->next = q;
return dummy->next;
}
ListNode* splitList(ListNode* list){
ListNode* slow = list;
ListNode* fast = list->next;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
}
ListNode* res = slow->next;
slow->next = nullptr;
return res;
}
ListNode* sortList(ListNode* head) {
if(!head || !head->next)
return head;
ListNode* list1 = head;
ListNode* list2 = splitList(head);
return mergeList(sortList(list1), sortList(list2));
}
};