倒序输出链表
文章目錄
- 題目描述
- 思路
- 遞歸法
- 棧
題目描述
輸入一個鏈表的頭節(jié)點,從尾到頭反過來返回每個節(jié)點的值(用數(shù)組返回)。
示例 1:
輸入:head = [1,3,2]
輸出:[2,3,1]
限制:
0 <= 鏈表長度 <= 10000
思路
只是想做出來的話,不斷用insert在vector首元素之前插入鏈表的值就好了。但是在順序容器的相關(guān)知識里說過,vector除尾后之外的位置進行插入操作都會將后面的元素全部移動一遍,代價是很大的,而題目想要返回vector,顯然不是想要直接進行首元素之前的insert操作(雖然試了試也過了。。。)
遞歸和棧兩種方法效率上并無優(yōu)劣之分,時間復(fù)雜度和空間復(fù)雜度是一樣的,但是如果測試數(shù)據(jù)過大有沒有可能導(dǎo)致遞歸法崩潰呢?這是我一直所擔(dān)心的問題。
其實棧的先進后出思想是最契合本題的。
遞歸法
class Solution { public:vector<int> vc;vector<int> reversePrint(ListNode* head) {recur(head);return vc;}void recur(ListNode* head){if(head == NULL){return;}recur(head->next);vc.push_back(head->val);} };時間復(fù)雜度 O(N): 遍歷鏈表,遞歸 N 次。
空間復(fù)雜度 O(N): 系統(tǒng)遞歸需要使用 O(N)的棧空間。
棧
class Solution { public:vector<int> reversePrint(ListNode* head) {vector<int> vc;stack<int> si;while(head != NULL){si.push(head->val);head = (*head).next;}while(!si.empty()){vc.push_back(si.top());si.pop();}return vc;} };時間復(fù)雜度 O(N): 入棧和出棧共使用 O(N)時間。
空間復(fù)雜度 O(N): 棧 si 和數(shù)組 vc 共使用 O(N)的額外空間。
總結(jié)
- 上一篇: Windows LTSC、LTSB、Se
- 下一篇: 当年,兔子学姐靠这个面试小抄拿了个22k