1. 程式人生 > 實用技巧 >LeetCode-148. 排序連結串列,歸併排序

LeetCode-148. 排序連結串列,歸併排序

struct ListNode {
      int val;
      ListNode *next;
      ListNode() : val(0), next(NULL) {}
      ListNode(int x) : val(x), next(NULL) {}
      ListNode(int x, ListNode *next) : val(x), next(next) {}
 };

class Solution {
public:
    ListNode* sort(ListNode* head) {
        if(head==NULL)
        return NULL;
        ListNode* end=head;
        while(end->next)
        {
            end=end->next;
        }
        return sortList(head,end);
    }
    ListNode* sortList(ListNode* head,ListNode* end) {
        if(head==end)
            return head;
        if(head->next==end)
        {
            int tempp;
            if(head->val>head->next->val)
            {
                tempp=head->val;
                head->val=head->next->val;
                head->next->val=tempp;
            }
            return head;
        }
        ListNode* mid=head,*tail=head->next;
        while(tail!=end)
        {
            mid=mid->next;
            tail=tail->next;
            if(tail->next)
                tail=tail->next;
        }
        ListNode* midnext=mid->next;//儲存第二個連結串列首地址
        mid->next=NULL;//斷開兩段連結串列
        return mergeList(sortList(head,mid),sortList(midnext,end));
    }
    ListNode* mergeList(ListNode* a,ListNode* b){
        ListNode* tempnode= new ListNode(0);//建立個頭節點,方便下面的處理,兩連結串列元素均放在此頭結點之後
        ListNode* traverse= tempnode;
        while(a&&b)//兩連結串列均有元素
        {
            if(a->val<=b->val)
            {
                traverse->next=a;
                a=a->next;
            }else
            {
                traverse->next=b;
                b=b->next;
            }
            traverse=traverse->next;
        }
        if(a)
        traverse->next=a;
        if(b)
        traverse->next=b;
        return tempnode->next;
    }
};