面试题06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
解法一
遍历链表,把元素依次存入 vector,最后调用 algorithm::reverse
逆转即可
遍历链表并存入 vector 的时间复杂度 O(n),逆转共需进行 n/2 次交换,总的时间复杂度 O(n),空间复杂度 O(1) ,题目要求的 vector 空间不算在内
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v;
ListNode* p = head;
while(p != NULL) {
v.push_back(p->val);
p = p->next;
}
reverse(v.begin(), v.end());
return v;
}
};
执行用时 :4 ms, 在所有 C++ 提交中击败了94.99%的用户
内存消耗 :8.9 MB, 在所有 C++ 提交中击败了100.00%的用户
解法二
也可以借助栈,先遍历链表把元素存入 stack,再把栈的元素存入 vector
遍历入栈的时间复杂度 O(n),出栈存入 vector 的时间复杂度 O(n),总的时间复杂度 O(n),空间复杂度 O(n)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v;
stack<int> s;
ListNode* p = head;
while(p != NULL) {
s.push(p->val);
p = p->next;
}
while(s.size() != 0) {
v.push_back(s.top());
s.pop();
}
return v;
}
};
执行用时 :8 ms, 在所有 C++ 提交中击败了69.66%的用户
内存消耗 :9.3 MB, 在所有 C++ 提交中击败了100.00%的用户