• Sort List


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

    /**
     * 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) 
        {
            ListNode* left;
            ListNode* right;
            quicksort(head,left,right);
            return left;
        }
        
        void quicksort(ListNode* head,ListNode*& left,ListNode*& right)
        {
            if(head==NULL)
            {
                left=NULL;right=NULL;
                return;
            }
            if(head->next==NULL)
            {
                left=head;
                right=head;
                return;
            }
            
            ListNode* headsmall=NULL;
            ListNode* smallp;
            
            ListNode* pre=head;
            ListNode* p=head->next;
            int val=head->val;
            
            bool issame=true;
            while(p!=NULL)
            {
                while(p!=NULL)
                {
                    if(p->val!=val) issame=false;
                    if(p->val<val) break;
                    pre=p;
                    p=p->next;
                }
                if(p!=NULL)
                {
                    pre->next=p->next;
                    if(headsmall==NULL) 
                    {
                        headsmall=p;
                    }
                    else
                    {
                        smallp->next=p;
                    }
                    smallp=p;
                    p=p->next;
                    smallp->next=NULL;
                }
            }
            //all the same
            if(issame && headsmall==NULL)
            {
                left=head;
                right=pre;
                return;
            }
            
            ListNode* headbig=head->next;
            head->next=NULL;
            
            ListNode* bigleft;
            ListNode* bigright;
            ListNode* smallleft;
            ListNode* smallright;
            
            if(headsmall!=NULL && headbig!=NULL)
            {
                quicksort(headbig,bigleft,bigright);
                quicksort(headsmall,smallleft,smallright);
                smallright->next=head;
                head->next=bigleft;
                left=smallleft;
                right=bigright;
            }
            else if(headsmall==NULL)
            {
                quicksort(headbig,bigleft,bigright);
                head->next=bigleft;
                left=head;
                right=bigright;
            }
            else if(headbig==NULL)
            {
                quicksort(headsmall,smallleft,smallright);
                smallright->next=head;
                left=smallleft;
                right=head;
            }
        }
    };
  • 相关阅读:
    14组作品的优点与建议
    人月神话读后感1
    [置顶] acm入门
    POJ 3041 Asteroids 【匈牙利算法最小点覆盖】
    acm入门
    【转】acm入门
    POJ 1469 COURSES【匈牙利算法入门 二分图的最大匹配 模板题】
    二分图最大匹配总结【转自kb神】
    POJ 3041 Asteroids (匈牙利算法最小点覆盖)
    POJ 1258 AgriNet (最小生成树入门题目)
  • 原文地址:https://www.cnblogs.com/erictanghu/p/3759725.html
Copyright © 2020-2023  润新知