题目难度:中等
题目考察:链表
题目内容:输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
题目分析:
首先一个链表不遍历一遍无法知道长度,所以这题时间复杂度最低是O(n),并且题目要找到倒数第k个数,如果我们知道了链表有n个数,倒数第k个实际上就是正数第n-k+1个。
算法1:遍历
正数第n-k个就很容易找出了,只需要遍历一遍数组即可
下面要考虑链表长度小于k要返回一个空链表
下面给出代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* FindKthToTail(ListNode* pHead, int k) {
// write code here
int idx=0,kk=0;
//idx记录链表长度,kk记录正数第几个数
ListNode *ans=pHead;
//先记录下头节点
while(pHead)
{
idx++;
pHead=pHead->next;
//指向下一个,idx加1
}
//这时候链表长度是idx
while(ans)
{
kk++;
//此时ans是正数第kk个节点
if(kk==idx-k+1)
{
//找到了第idx-k+1个数则返回
return ans;
}
ans=ans->next;
}
//上面如果找不到第idx-k+1会跳出,输出空链表即可
return NULL;
}
};算法2:构造
下面给出另外一种解法,可以直接将链表的数填入vector中,将最后k个数字构造成链表即可
这实际上和上面的思路一样,但是这一个通过数组实现,代码更为简单
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* FindKthToTail(ListNode* pHead, int k) {
// write code here
//当链表为空时
if(pHead==nullptr) return nullptr;
//先把各个结点装入数组中
vector<ListNode*> result;
while(pHead!=nullptr){
result.push_back(pHead);
pHead=pHead->next;
}
//如果K大于链表的长度
if(k>result.size()) return nullptr;
//直接返回
return result[result.size()-1-(k-1)];
}
};
京公网安备 11010502036488号