思路:用歸併排序。對一個鏈表採用遞歸進行二等分,直到每一個部分有序,而後對其進行合併。其實就是兩步,先分解,而後合併有序鏈表。 代碼: //對鏈表採用遞歸排序 class Solution { public: ListNode* sortList(ListNode* head){ if(head==NULL||head->next==NULL) return head; return mergeSort(head); } ListNode* mergeSort(ListNode* head){ //遞歸終止條件 if(head==NULL||head->next==NULL) return head; ListNode* p=head;ListNode* q=head;ListNode* prep=NULL; while (q!=NULL&&q->next!=NULL) { q=q->next->next; prep=p; p=p->next; } prep->next=NULL;//對鏈表進行切分 ListNode* lhalf=mergeSort(head); ListNode* rhalf=mergeSort(p); ListNode* res=merge(lhalf,rhalf); return res; } //合併兩個有序鏈表 ListNode* merge(ListNode* lh,ListNode* rh){ ListNode* tempHead=new ListNode(0); ListNode* p=tempHead; while (lh&&rh) { if(lh->val<=rh->val){ p->next=lh; lh=lh->next; }else{ p->next=rh; rh=rh->next; } p=p->next; } if(lh==NULL) p->next=rh; else p->next=lh; p=tempHead->next; tempHead->next=NULL; delete tempHead; return p; } };