单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)

/**
 * 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||!head->next) return head;

        ListNode*pslow=head;
        ListNode*pfast=head->next;
        while(pfast&&pfast->next){
            pslow=pslow->next;
            pfast=pfast->next->next;
        }
        ListNode*h2=pslow->next;
        pslow->next=NULL;
        ListNode*p1=sortList(head);
        ListNode*p2=sortList(h2);
        return mergeList(p1,p2);

    }

    ListNode* mergeList(ListNode* headA,ListNode*headB){
        ListNode*newhead=new ListNode(0);
        ListNode*tail=newhead;
        while(headA&&headB){
            if(headA->valval){
                tail->next=headA;
                tail=headA;
                headA=headA->next;
            }else{
                tail->next=headB;
                tail=headB;
                headB=headB->next;
            }
        }
        while(headA) {
            tail->next=headA;
            tail=headA;
            headA=headA->next;
        }
        while(headB) {
            tail->next=headB;
            tail=headB;
            headB=headB->next;
        }
        ListNode* rehead=newhead->next;
        delete newhead;
        return rehead;
    }

};

你可能感兴趣的:(数据结构)