这道题可以用快排的变形也可以用mergeSort合并排序来处理,我用的是合并排序。
即一个函数mergeSort处理讲链表二份,再用递归的方法合并排序,另外一个函数Merge来处理链表合并。
需要注意的就是链表二分时判断条件和原来的那个链表要从中间断开。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *sortList(ListNode *head) {
return mergeSort(head);
}
ListNode* mergeSort(ListNode* head){ //合并排序
if(head==NULL||head->next==NULL)return head;
ListNode* p=head;
ListNode* q=head;
ListNode* pre=head;
while(q!=NULL&&q->next!=NULL){ //为了找到指向中位数的指针 p
q=q->next->next;
pre=p;
p=p->next;
}
pre->next=NULL; //链表从中间断开
ListNode *h1=mergeSort(head); //将链表分成两半后再排序
ListNode *h2=mergeSort(p);
return merge(h1,h2);
}
ListNode* merge(ListNode* h1,ListNode *h2){
if(h1==NULL)return h2;
if(h2==NULL)return h1;
ListNode* l3=NULL;
ListNode* ans=NULL;
while(h1!=NULL&&h2!=NULL){
if(h1->val<=h2->val){
if(l3==NULL){ //l3为空初始化
l3=new ListNode(h1->val);
ans=l3;
}
else
l3=pushBack(l3,h1->val);
h1=h1->next;
}else{
if(l3==NULL){
l3=new ListNode(h2->val); //l3不为空压入栈
ans=l3;
}
else
l3=pushBack(l3,h2->val);
h2=h2->next;
}
}
if(h1!=NULL){
l3->next=h1;
}else
l3->next=h2;
return ans;
}
ListNode* pushBack(ListNode* l,int val){
ListNode* last=new ListNode(val);
l->next=last;
return last;
}
};
快排方法可以参考
http://blog.csdn.net/magisu/article/details/16814915
想法很好,思路也很清晰。