归并排序
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
//cut:将head链表切分为两段 前size个和剩余节点 前一段链表末位置空 返回后一段链表头节点
//merge:合并两个有序链表 返回头节点
ListNode* cut(ListNode* head,int size){
if (head == nullptr)return head;
int sum = 1;
while (sum < size && head != nullptr) {
head = head->next;
sum++;
}
if (head != nullptr) {//1.有充足节点够切分 即size小于等于链表head长度
ListNode* temp = head->next;
head->next = nullptr;
return temp;
}
else {//2.不够切分 直接返回空指针
return nullptr;
}
}
ListNode* merge(ListNode* left,ListNode* right){
ListNode* head=new ListNode(0);
ListNode* temp=head;
while(left!=nullptr&&right!=nullptr){
if(left->val<=right->val){
temp->next=left;
left=left->next;
}else{
temp->next=right;
right=right->next;
}
temp=temp->next;
}
if(left!=nullptr)
temp->next=left;
if(right!=nullptr)
temp->next=right;
return head->next;
}
public:
ListNode* sortList(ListNode* head) {
if(head==nullptr||head->next==nullptr)return head;
int sum=0;
ListNode* temp=head;
while(temp!=nullptr){
temp=temp->next;
sum++;
}
ListNode* new_head=new ListNode(0);
new_head->next=head;
for(int len=1;len<sum;len=len*2){
ListNode* tail=new_head;
ListNode* nowhead;
temp=new_head->next;
while(temp!=nullptr){
//1.divide
ListNode* left=temp;
temp=cut(temp,len);
ListNode* right=temp;
temp=cut(temp,len);
//2.conquer
nowhead=merge(left,right);
//3. ①上个链表和当前链表连接
// ②更新链表尾指针
tail->next=nowhead;
while(nowhead->next!=nullptr){
nowhead=nowhead->next;
}
tail=nowhead;
}
}
return new_head->next;
}
};