地址的地址,即指针的指针,懂不懂?
思想:将一个链表分为两个链表,然后递归分解,再合并!
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
void QuickSort(ListNode *&head,ListNode *&end){
ListNode *begin1,*begin2,*end1,*end2;
begin1=begin2=end1=end2=NULL;
if(head==NULL)
return;
ListNode *p;
p=head->next;
head->next=NULL;
while(p!=NULL){
if(p->val < head->val){
if(!begin1) {
begin1=end1=p;
p=p->next;
end1->next=NULL;
}
else{
end1->next=p;
end1=p;
p=p->next;
end1->next=NULL;
}
}
else{
if(!begin2) {
begin2=end2=p;
p=p->next;
end2->next=NULL;
}
else{
end2->next=p;
end2=p;
p=p->next;
end2->next=NULL;
}
}
}
QuickSort(begin1,end1);
QuickSort(begin2,end2);
if(end1 && begin2){
end1->next = head;
head->next= begin2;
head=begin1;
end=end2;
}else if(end1){
end1->next = head;
end=head,head=begin1;
}else if(begin2){
head->next=begin2;
end=end2;
}
}
ListNode *sortList(ListNode *head) {
ListNode *p=head;
if(p==NULL || p->next==NULL) return head;
while(p->next != NULL){
p=p->next;
}
QuickSort(head,p);
return head;
}
};
void present(ListNode *head){
ListNode *p=head;
while(p!=NULL){
cout<<p->val<<' ';
p=p->next;
}
cout<<endl;
}
int main()
{
Solution SS;
ListNode *head;
ListNode list1(1);
ListNode list2(2);
ListNode list3(1);
head=&list1;
list1.next=&list2;
list2.next=&list3;
present(head);
head=SS.sortList(head);
present(head);
//cout << "Hello world!" << endl;
return 0;
}