Sort a linked list in O(n log n) time using constant space complexity.
归并排序:
class Solution { //小->大
public:
void merge(ListNode *&p1,ListNode *&p2){
if (!p1 && !p2) return;
if (!p1) {
p1 = p2;
while (p2->next) {
p2 = p2->next;
}
return ;
}
if (!p2) {
p2 = p1;
while (p2->next) {
p2 = p2->next;
}
return ;
}
ListNode *head,*first;
if (p1->val<p2->val){
first = head = p1;
p1 = p1->next;
} else {
first = head = p2;
p2 = p2->next;
}
while (p1 && p2) {
if (p1->val<p2->val) {
first->next = p1;
first = p1;
p1 = p1->next;
} else {
first->next = p2;
first = p2;
p2 = p2->next;
}
}
while (p1) {
first->next = p1;
first = p1;
p1 = p1->next;
}
while (p2) {
first->next = p2;
first = p2;
p2 = p2->next;
}
p1 = head;
p2 = first;
}
ListNode *sortList(ListNode *head) {
ListNode *pre,*last,*p1,*p2;
ListNode *p = head,*temp ;
int len=0;
while ( p ){
p = p->next;
len++;
}
for (int step=1; step<len; step<<=1) {
p = head;
pre = NULL;
while (p ) {
p1 = p;
for (int i=1; p && i<step; ++i)
p = p->next;
if (!p || !p->next) {
pre->next = p1;
break ;
}
p2 = p->next;
p->next = NULL;
p = p2;
for (int i=1; p && i<step; ++i)
p = p->next;
if (p) {
temp = p;
p = p->next;
temp->next = NULL;
}
merge(p1,p2);
if (pre) {
pre->next = p1;
} else{
head = p1;
}
pre = p2;
}
}
return head;
}
};