思路:归并排序
- 自底向上:从长度为1开始,两两归并
- 每次长度*2
/**
* 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* sortList(ListNode* head) {
int n = 0;
for(auto node=head; node; node=node->next) n++;
for(int i=1; i<n; i=2*i) //区间长度为 i ,进行归并
{
auto dummy = new ListNode(-1);
auto curP = dummy;
for(int j=1; j<=n; j=j+i*2) //每一层要归并的次数
{
auto p = head, q = head; //要归并的两个区间的头节点
for(int k=0; k<i&&q; k++) q = q->next;
auto tmp = q;
for(int k=0; k<i&&tmp; k++) tmp = tmp->next;//下一次归并的头结点
int l = 0, r = 0;
while(l<i && r<i && p && q)
{
if(p->val < q->val)
{
curP->next = p;
curP = curP->next;
p = p->next;
l++;
}else{
curP->next = q;
curP = curP->next;
q = q->next;
r++;
}
}
while(l<i && p){
curP->next = p;
curP = curP->next;
p = p->next;
l++;
}
while(r<i && q)
{
curP->next = q;
curP = curP->next;
q = q->next;
r++;
}
head = tmp;
}
curP->next = NULL;
head = dummy->next;
}
return head;
}
};