148 排序鍊錶 遞迴或迭代

2021-10-10 15:43:37 字數 1128 閱讀 4331

如果要求o1空間則只能迭代,遞迴呼叫函式會浪費logn的空間。

鍊錶排序的大體思路:

模擬陣列歸併排序

1、遞迴:

每次用快慢指標找出鍊錶中點,然後遞迴下去,每層歸併排序。

利用虛節點當鍊表首部,進行拼接鍊錶,由於我們只是改變鍊錶的引用,沒有另外開闢空間,所有空間只是遞迴浪費的logn層空間。

2、迭代:

相當於搜尋樹上自底向上跑,倒數第i層一定是每相鄰的 (1<<(i-1))歸併排序。

具體細節看**。

/**

* definition for singly-linked list.

* struct listnode

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

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

* };

*/class solution

listnode *head2 = slow->next;

slow -> next = nullptr;//斷開鍊錶,兩邊分開處理

head = merge(head);

head2 = merge(head2);

//現在左右鍊錶均排好序了,歸併合併即可。

}listnode* sortlist(listnode* head) cout val) ))else

tmp = tmp -> next;

}return ans->next;

} listnode* split(listnode* tmp,int n)

if(!tmp)return nullptr;

listnode* tp = tmp->next;

tmp->next=nullptr;

return tp;

} listnode* sortlist(listnode* head)

head=cur;

for(int i=1;(1<<(i-1))<=len;i++)

};

148 排序鍊錶

根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...

148 排序鍊錶

自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...

148 排序鍊錶

難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...