leetCode148 排序鍊錶

2021-10-10 17:07:02 字數 2710 閱讀 5589

目錄

一、題目描述

二、解題思路

三、**實現

給你鍊錶的頭結點 head ,請將其按公升序排列並返回排序後的鍊錶

高階:

示例 1:

輸入:head = [4,2,1,3]

輸出:[1,2,3,4]

示例 2:

輸入:head = [-1,5,3,4,0]

輸出:[-1,0,3,4,5]

示例 3:

輸入:head =

輸出:

從常規的排序演算法入手,快排的平均時間複雜度為logn級別,但是最壞可以達到二次方級別,空間要求為常數;歸併排序時間複雜度滿足要求,但常規的空間複雜度為logn級別。綜上,常規的這兩種都不是最符合題目要求的,但是提交都是可以通過的。

要完全符合要求的話,需要對歸併排序進行修改,不能使用遞迴的歸併,需要改為迭代。方式為將鍊錶劃分為一段一段有序的短鍊錶,將短鍊錶逐步合併為有序的長鍊錶,當鍊表長度為1時,是有序的。所以短鏈的長度依次區1,2,4,8…逐步合併,最終有序。

下面用c++把上述方法依次實現一遍

#includeusing namespace std;

struct listnode

listnode(int x) : val(x), next(nullptr) {}

listnode(int x, listnode *next) : val(x), next(next) {}

};listnode* partition(listnode* low, listnode* high)

quick = quick->next;

} //把基準值放在正確的位置

swap(low->val, slow->val);

return slow;

}//方法一:鍊錶快排

void quicksortlist(listnode* low, listnode* high)

//方法二:鍊錶歸併排序

listnode* mergelist(listnode* head1, listnode* head2) else

newhead = newhead->next;

} if (tmp1)

if (tmp2)

return res->next;

}listnode* mergesort(listnode* head, listnode* tail)

listnode* mid = slow->next;

slow->next = nullptr;

return mergelist(mergesort(head, slow->next), mergesort(mid, tail));

}listnode* sortlist(listnode* head)

//題解所述方法:自低向上歸併

//sublength = 1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)

//sublength = 2 : (1->3->4->7)->(2->8->9->11)->(5->6)

//sublength = 4 : (1->2->3->4->7->8->9->11)->(5->6)

//sublength = 8 : (1->2->3->4->5->6->7->8->9->11)

listnode* sortlist1(listnode* head)

int length = 0;

listnode* node = head;

while (node != nullptr)

listnode* dummyhead = new listnode(0, head);

for (int sublength = 1; sublength < length; sublength <<= 1)

listnode* head2 = curr->next;

curr->next = nullptr;

curr = head2;

for (int i = 1; i < sublength && curr != nullptr && curr->next != nullptr; i++)

listnode* next = nullptr;

if (curr != nullptr)

listnode* merged = mergelist(head1, head2);

prev->next = merged;

while (prev->next != nullptr)

curr = next;

} }return dummyhead->next;

}int main()

return 0;

}

Leetcode 148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...

LeetCode 148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3輸出 1 2 3 4示例 2 輸入 1 5 3 4 0輸出 1 0 3 4 5歸併這裡我感覺有點不符合題意 不符合常數空間 如果是快排的話呢,交換節點還是很麻煩的,所以快排交換值了 癱.jpg cl...

leetcode148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 看到題目就知道要二分,這裡用的是遞迴版歸併 definition for singly linked list....