链表的排序 时间复杂度O(nlogn)
思路:用归并排序。对一个链表采用递归进行二等分,直到每个部分有序,然后对其进行合并。其实就是两步,先分解,然后合并有序链表。 代码: //对链表采用递归排序 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; } };