文章目录
- 题目描述
- 思路
- 递归法
- 栈
题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
思路
只是想做出来的话,不断用insert在vector首元素之前插入链表的值就好了。但是在顺序容器的相关知识里说过,vector除尾后之外的位置进行插入操作都会将后面的元素全部移动一遍,代价是很大的,而题目想要返回vector,显然不是想要直接进行首元素之前的insert操作(虽然试了试也过了。。。)
递归和栈两种方法效率上并无优劣之分,时间复杂度和空间复杂度是一样的,但是如果测试数据过大有没有可能导致递归法崩溃呢?这是我一直所担心的问题。
其实栈的先进后出思想是最契合本题的。
递归法
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);}
};
时间复杂度 O(N): 遍历链表,递归 N 次。
空间复杂度 O(N): 系统递归需要使用 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;}
};
时间复杂度 O(N): 入栈和出栈共使用 O(N)时间。
空间复杂度 O(N): 栈 si 和数组 vc 共使用 O(N)的额外空间。