代码改变世界

Sort List

2015-04-18 22:32  iun  阅读(151)  评论(0)    收藏  举报

Sort a linked list in O(n log n) time using constant space complexity.

快排,关键在于优化划分函数,即划分之后,元素的值为key的元素都放到中间,否则不能通过{1,3,3,1,3,1,3,3,2,3,2。。。。}该数据。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* partition_z(ListNode *p,ListNode *q,ListNode *& r){
        int k=p->val;
        ListNode* s=p;
        for(ListNode* t=p->next;t!=q;t=t->next){
           if(t->val<k){
               s=s->next;
               swap(s->val,t->val);
           }
        }
       swap(s->val,p->val);
        ListNode* x=s;
        p=s;
        for(ListNode* t=p->next;t!=q;t=t->next){
           if(t->val<=k){
               s=s->next;
               swap(s->val,t->val);
           }
        }
        r=s;
       return x;
    }
    void sort_z(ListNode *p,ListNode *q){
        if(p==q)return;
        int len=0;
        for(ListNode *t=p;t!=q;t=t->next)len++;
        int k=rand()%len;
        ListNode *t=p;
        for(int i=0;i<k;i++,t=t->next);
        swap(p->val,t->val);
       ListNode *r=partition_z(p,q,t);
       sort_z(p,r);
       sort_z(t->next,q);
    }
    ListNode *sortList(ListNode *head) {
        sort_z(head,NULL);
        return head;
    }
};