链表的二路归并排序

来源:互联网 发布:淘宝店铺评价好的包包 编辑:程序博客网 时间:2024/06/16 12:20
/** * 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;        return mergeSort(head);    }    ListNode* mergeSort(ListNode*head)    {        if(head->next==NULL)            return head;        ListNode* pHead,*qHead,*pre;        pHead=head;        qHead=head;        pre=NULL;        while(qHead!=NULL&&qHead->next!=NULL)        {           qHead=qHead->next->next;           pre=pHead;           pHead=pHead->next;        }        pre->next=NULL;        ListNode *l,*r;        l=mergeSort(head);        r=mergeSort(pHead);        return merge(l,r);    }    ListNode* merge(ListNode *l,ListNode*r)    {        ListNode *pRes=new ListNode(0);        ListNode *temp=pRes;        while(l!=NULL&&r!=NULL)        {            if(l->val<=r->val)            {                temp->next=l;                temp=temp->next;                l=l->next;            }            else            {                temp->next=r;                temp=temp->next;                r=r->next;            }        }        if(l!=NULL)            temp->next=l;        if(r!=NULL)            temp->next=r;        temp=pRes->next;        delete pRes;        return temp;       }    };