如果要求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...