leetcode148排序鏈表_C++_med

在 O(n log n) 時間複雜度和常數級空間複雜度下,對鏈表進行排序。

示例 1:

輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:

輸入: -1->5->3->4->0
輸出: -1->0->3->4->5

思路:這個時間複雜度,肯定是要用歸併排序,快速排序,堆排序之一的排序的算法。

先寫歸併排序: 歸併排序的核心就是從中間分,分,分,然後合併。有一點要注意的是:拆分的時候有要把鏈表分開,藉助cur指針。

C++ 代碼如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    ListNode* merge(ListNode* l1,ListNode* l2) //相當於兩個有序鏈表的合併
    {
        ListNode *start = new ListNode(0);
        ListNode *tail =start;
        while(l1 && l2)
        {
            if(l1->val < l2->val)
            {
                tail->next = l1;
                l1=l1->next;
            }
            else{
                tail->next =l2;
                l2 = l2->next;
            }
            tail =tail->next;
        }
        if(l1) tail->next = l1;
        if(l2) tail->next = l2;
        return start->next;
    }
public:
    ListNode* sortList(ListNode* head) { //有一個問題在於要把鏈表從中間斷開
        if(!head ||!head->next) return head;
        //找到中間結點
        ListNode *fast=head , *slow=head, *cur=NULL;
        while(fast && fast->next)
        {
            cur = slow;
            fast=fast->next->next;
            slow= slow->next;
        }
        cur->next = NULL;
        return merge(sortList(head),sortList(slow));      
        
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章