leetCode(5):Sort List 分类: leetCode 2015-06-17 09:45 170人阅读 评论(0) 收藏

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

          分析:排序算法中,堆排序、归并排序、快速排序、希尔排序的时间复杂度是nlogn,堆排序和归并排序对下标依赖性比较强,比较适合顺序表的排序,对链表处理起来比较复杂。希尔排序用的比较少。所以我选择的是快速排序,结果是正确的,但时间超出限制了。如果有大神做过同样的题目,跪求告知解法~~~~


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
   ListNode* partion(ListNode* head,ListNode* start,ListNode* end,ListNode** newEnd)
    {
    	int key=end->val;
    	ListNode* pre=start;
    	ListNode* behind=start;
    	
    	*newEnd=behind;
    	while(pre!=end)
    	{
    		if(pre->val < key)
    		{
    			if(pre!=behind)
    			{
    				int tmp=pre->val;
    				pre->val=behind->val;
    				behind->val=tmp;
    			}
    			
    			*newEnd=behind;
    			behind=behind->next;							
    		}
    		pre=pre->next;	
    	}
    	
    	int tmp=pre->val;
    	pre->val=behind->val;
    	behind->val=tmp;
    	return behind;	
    }
    void qSort(ListNode* head,ListNode* start,ListNode* end)
    {
    	if(start!=end)
    	{
    		ListNode* newEnd=NULL;
    		ListNode* mid=partion(head,start,end,&newEnd);
    		if(mid!=end)
    			qSort(head,mid->next,end);
    		qSort(head,start,newEnd);
    	}
    }
    ListNode* sortList(ListNode* head) {
        if(head==NULL)
    		return NULL;
    	ListNode* p=head;	
    	while(p->next)
    		p=p->next;		
    	qSort(head,head,p);	
    	return head;
    }
};


原文地址:https://www.cnblogs.com/zclzqbx/p/4687112.html