算法實現:自底向上的歸並排序
/** * 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; int n=0; auto p=head; auto l=new ListNode(-1); l->next=head; while(p){ n++; p=p->next; } for(int i=1;i<n;i*=2){//枚舉區間長度 auto cur=l; for(int j=0;j<n-i;j+=i*2){//枚舉區間起點 auto f=cur->next,s=cur->next; for(int k=0;k<i;k++)s=s->next;//第二個表頭 int le=0,ri=0; while(le<i&&ri<i&&s){//歸並過程,由於s在f前面,需判定s是否已經排序完 if(f->val>s->val){ cur->next=s; cur=s; s=s->next; ri++; } else{ cur->next=f; cur=f; f=f->next; le++; } } while(le<i){ cur->next=f; cur=f; f=f->next; le++; } while(ri<i&&s){ cur->next=s; cur=s; s=s->next; ri++; } cur->next=s; } } return l->next; } };