题目描述
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
题解
思路一 :数组
做法一
用vector 作为数组存储节点,最后利用vector的函数计算出长度,就能找到倒数第k个数
class Solution {
public:
int kthToLast(ListNode* head, int k) {
vector<int> v;
while(head){
v.push_back(head->val);
head=head->next;
}
return v[v.size()-k];
}
};
时间复杂度O(n) 空间复杂度O(n)
做法二
普通数组存储。空间复杂度O(n) 时间复杂度 O(n) 不过要比做法是耗时长,太简单,不写了
思路二: 双指针
倒数第k个数,就是正数第(长度-k)个数
p指向第k+1 个数 同时遍历p和 head ,一共走过(长度-k)此时head即为所求
class Solution {
public:
int kthToLast(ListNode* head, int k) {
ListNode* p = head;
while (k--){
p = p->next;
}
while(p){
p = p->next;
head = head->next;
}
return head->val;
}
};
空间复杂度O(1) 时间复杂度(1)
思路三:递归
递归到尾部,然后使用一个哨兵x,从后往前遍历(x++),直到倒数第k个(x++ >= k)
class Solution {
public:
int x = 1;
int kthToLast(ListNode* head, int k) {
if(head->next == NULL) return head->val;
int ans = kthToLast(head->next,k);
if( x++ >= k){
return ans;
}
else return head->val;
}
};
时间复杂度O(1) 空间复杂度(1)