<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)148:排序鏈表

          共 2903字,需瀏覽 6分鐘

           ·

          2021-01-09 16:34

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?排序鏈表,我們先來看題面:
          https://leetcode-cn.com/problems/sort-list/

          Given the head of a linked list, return the list after sorting it in ascending order.


          Follow up: Can you sort the linked list in O(n logn) time and O(1) memory (i.e. constant space)?

          題意


          給你鏈表的頭結(jié)點(diǎn) head ,請將其按 升序 排列并返回 排序后的鏈表 。

          進(jìn)階:
          你可以在 O(n log n) 時(shí)間復(fù)雜度和常數(shù)級空間復(fù)雜度下,對鏈表進(jìn)行排序嗎?


          樣例

          解題

          https://blog.csdn.net/qq_41855420/article/details/87901524

          解題思路:
          思路分析:由于題目特意要求 O(n log n) 時(shí)間復(fù)雜度和常數(shù)級空間復(fù)雜度 所以不能使用冒泡、計(jì)數(shù)排序啥的,比較符合要求的就是歸并排序。
          歸并排序:排序一段序列分為排序前部分、后部分,再合并兩個(gè)已經(jīng)排序好的部分。


          /**
          ?* Definition for singly-linked list.
          ?* struct ListNode {
          ?* int val;
          ?* ListNode *next;
          ?* ListNode(int x) : val(x), next(NULL) {}
          ?* };
          ?*/

          class?Solution?{
          public:
          ??ListNode* sortList(ListNode* head) {
          ????if?(head == NULL?|| head->next == NULL) {
          ??????return?head;
          ????}
          ????ListNode *end = head;//定位到鏈表的尾部
          ????while?(end != NULL?&& end->next != NULL) {
          ??????end = end->next;
          ????}
          ????return?mergeSort(head, end);
          ??}
          ??//歸并排序
          ??ListNode* mergeSort(ListNode* head, ListNode *end) {
          ????if?(head == end) {//這段鏈表只有一個(gè)節(jié)點(diǎn)
          ??????return?head;
          ????}
          ????if?(head->next == end) {//只有兩個(gè)節(jié)點(diǎn)
          ??????if?(head->val > end->val) {
          ????????int tempVaule = head->val;
          ????????head->val = end->val;
          ????????end->val = tempVaule;
          ??????}
          ??????return?head;
          ????}
          ????????//快慢指針,定位鏈表中間
          ????ListNode *slowPtr = head, *fastPtr = head;
          ????while?(fastPtr != end) {
          ??????slowPtr = slowPtr->next;//慢指針走一步
          ??????fastPtr = fastPtr->next;//快指針走兩步
          ??????if?(fastPtr != end) {
          ????????fastPtr = fastPtr->next;//快指針走兩步
          ??????}
          ????}
          ????????
          ????//第一步 遞歸,排序右半
          ????ListNode * rightList = mergeSort(slowPtr->next, end);
          ????slowPtr->next = NULL;//將左右兩部分切開
          ????//第二步 遞歸,排序左半
          ????ListNode * leftList = mergeSort(head, slowPtr);
          ????????
          ????//第三步 合并
          ????ListNode *pHead = NULL, *pEnd = NULL;//合并鏈表的頭、尾
          ????if?(rightList == NULL) {
          ??????return?leftList;
          ????}
          ????//初始化頭結(jié)點(diǎn)、尾節(jié)點(diǎn)
          ????if?(rightList->val > leftList->val) {
          ??????pEnd = pHead = leftList;
          ??????leftList = leftList->next;
          ????}
          ????else?{
          ??????pEnd = pHead = rightList;
          ??????rightList = rightList->next;
          ????}
          ????//合并,每次將較小值放入新鏈表
          ????while?(rightList && leftList) {
          ??????if?(rightList->val > leftList->val) {
          ????????pEnd->next = leftList;
          ????????pEnd = pEnd->next;
          ????????leftList = leftList->next;
          ??????}
          ??????else?{
          ????????pEnd->next = rightList;
          ????????pEnd = pEnd->next;
          ????????rightList = rightList->next;
          ??????}
          ????}
          ????//可能某個(gè)鏈表有剩余
          ????if?(rightList == NULL) {
          ??????pEnd->next = leftList;
          ????}
          ????else?{
          ??????pEnd->next = rightList;
          ????}
          ????return?pHead;
          ??}
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。

          上期推文:

          LeetCode1-140題匯總,希望對你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)141:環(huán)形鏈表
          LeetCode刷題實(shí)戰(zhàn)142:環(huán)形鏈表 II
          LeetCode刷題實(shí)戰(zhàn)143:重排鏈表
          LeetCode刷題實(shí)戰(zhàn)144:二叉樹的前序遍歷
          LeetCode刷題實(shí)戰(zhàn)145:二叉樹的后序遍歷
          LeetCode刷題實(shí)戰(zhàn)146:LRU 緩存機(jī)制
          LeetCode刷題實(shí)戰(zhàn)147:對鏈表進(jìn)行插入排序


          瀏覽 85
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  老熟女一区二区三区 | 久久久久久久久久久久精 | 免费的黄色国产视频 | 日韩小视频在线观看 | www.免费看黄色电影 |