1. 程式人生 > 實用技巧 >20.11.21 leetcode148 連結串列排序

20.11.21 leetcode148 連結串列排序

題目連結:https://leetcode-cn.com/problems/sort-list/

題意:要求以O(nlogn)的複雜度給一個連結串列排序

分析:昨天那道題的升級版,這裡用的是歸併排序的思想,自頂向下的排序,從一開始完整的連結串列不斷的每次分成兩段,分到每段只有一個結點為止,再一點點的合併,要注意的是sortlist的函式是前閉後開的。

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        return sortList(head,nullptr);
    }

    ListNode* sortList(ListNode* head,ListNode* tail){
        
//cout<<233<<endl; if(head==nullptr)return head; if(head->next==tail){ head->next=nullptr; return head; } ListNode* slow=head,*fast=head; while(fast!=tail){ slow=slow->next; fast=fast->next;
if(fast!=tail)fast=fast->next; } return merge(sortList(head,slow),sortList(slow,tail)); } ListNode* merge(ListNode* head1,ListNode* head2){ ListNode* dummyHead=new ListNode(0); ListNode* tmp=dummyHead; ListNode* temp1=head1,*temp2=head2; while
(temp1!=nullptr&&temp2!=nullptr){ if(temp1->val<=temp2->val){ tmp->next=temp1; temp1=temp1->next; }else{ tmp->next=temp2; temp2=temp2->next; } tmp=tmp->next; } if(temp1!=nullptr)tmp->next=temp1; else if(temp2!=nullptr)tmp->next=temp2; return dummyHead->next; } };