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||head->next==NULL){
            return head;
        }
       ListNode*r= mergeSort(head);
        return r;        
    }
   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){//注意此处q的判断条件
            q=q->next->next;
            pre=p;
            p=p->next;
        }
        pre->next=NULL;//此处将分成两个子链表
        ListNode*s= mergeSort(head);
        ListNode*t=mergeSort(p);
       return merge(s,t);
        
    }
    ListNode * merge(ListNode*head,ListNode*p){
        ListNode* q=new ListNode(0);//申请一个节点,注意要释放
        ListNode* h1=q;
       
        while(head!=NULL&&p!=NULL){
            if(head->val<=p->val){
                h1->next=head;
                head=head->next;
            }else {
                h1->next=p;
                p=p->next;
            }
            h1=h1->next;            
        }
        if(p!=NULL){
            h1->next=p;           
        }
        if(head!=NULL){
            h1->next=head;
        }
        h1=q->next;
        q->next=NULL;
        delete(q);
        return h1;
        
    }
    
};

 通过题意的nlogn可知,需要用归并或者快排思想,以上代码沿用了数组归并排序的实现思想,快排也可。

你可能感兴趣的:(list)