LeetCode-148. 排序連結串列,歸併排序
阿新 • • 發佈:2020-11-21
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; } };