zoukankan      html  css  js  c++  java
  • 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) {
            if(head == NULL)return head;
            ListNode *temp = head;
            int n =0;
            while(temp!=NULL)
            {
                n++;
                temp = temp->next;
            }
            head =merge(head,n);
            return head;
        }
        ListNode *merge(ListNode *head, int n)
        {
            if(n>2)
            {
                ListNode * temp =head;
                ListNode * first;
                ListNode * second;
                ListNode * tail = NULL;
                int mid = (1+n)/2;
                for(int i = 0; i < mid ; i++)temp =temp->next;
                first = merge(head,mid);
                second = merge(temp,n-mid);
                //for(int i = mid; i < n ; i++)temp =temp->next;
                tail = temp->next;
                
                ListNode *ft =first;
                ListNode *st =second;
                ListNode *me = new ListNode(0);
                temp =me;
                while(ft!= NULL && st!= NULL)
                {
                    if(ft->val < st->val)
                    {
                        temp->next =ft;
                        temp = temp->next;
                        ft=ft->next;
                        temp->next =NULL;
                        
                    }
                    else
                    {
                        temp->next =st;
                        temp = temp->next;
                        st=st->next;
                        temp->next =NULL;
                        
                    }
                }
                if(ft!=NULL)
                {
                    temp->next = ft;
                    //while(ft->next!=NULL)ft =ft->next;
                    //ft->next = tail;
                    
                }
                else if(st!=NULL)
                {
                    temp->next = st;
                    //while(st->next!=NULL)st =st->next;
                    //st->next = tail;
                }
                return me->next;
            }
            else if(n == 2)
            {
                if(head->val > head->next->val )
                {
                    ListNode * temp =head;
                    ListNode * second = head->next;
                    temp->next = NULL;
                    head = second;
                    //temp->next = second->next;
                    head->next =temp;
                    return head;
                }
                else 
                {
                    head->next->next=NULL;
                    return head;
                    }
            }
            else if(n == 1)
            {
                head->next =NULL;
                return head;
            }
        }
        
        
        
        
        ListNode * sortl(ListNode *head , int n)
        {
            if(n<2)return head;
            ListNode * temp;
            ListNode * left =new ListNode(0);
            ListNode * lt = left;
            
            ListNode * right = new ListNode(0);
            ListNode * rt = right;
            ListNode * mid;
            mid = head;
            int va = mid->val;
            int ln = 0, rn = 0;
            temp = head->next;
            for(int i  =1 ; i < n-1 ; i++)
            {
                if(temp->val <= va)
                {
                    lt->next = temp;
                    lt =lt->next;
                    temp =temp->next;
                    ln++;
                }
                else
                {
                    rt->next = temp;
                    rt = rt->next;
                    temp =temp->next;
                    rn++;
                }
            }
            ListNode * tail = temp->next;
            if(temp->val <= va)
            {
                lt->next = temp;
                lt =lt->next;
                ln++;
            }
            else
            {
                rt->next = temp;
                rt = rt->next;
                rn++;
            }
            
            if(ln >0)
            {
                lt->next = mid;
                head = sortl(left->next,ln);
            }
            else
            head = mid;
            
            
            if(rn>0)
            {
                rt->next =tail;
                mid ->next= sortl(right->next,rn);
            }
            else
            mid->next=tail;
            
            
            return head;
            
        }
    };
    

      

  • 相关阅读:
    🔺 Garbage Remembering Exam UVA
    Cows and Cars UVA
    Probability|Given UVA
    Crossing Rivers HDU
    均匀分布和高斯分布
    Race to 1 UVA
    XMPPElementReceipt wait return,
    someone like you,
    第三方统计,
    截获的感觉,
  • 原文地址:https://www.cnblogs.com/pengyu2003/p/3621962.html
Copyright © 2011-2022 走看看