精选力扣500题 第33题 剑指Offer 22. 链表中倒数第k个节点c++ / java 详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第33题 剑指Offer 22. 链表中倒数第k个节点c++ / java 详细题解相关的知识,希望对你有一定的参考价值。
1、题目
输入一个链表,输出该链表中倒数第k
个节点。为了符合大多数人的习惯,本题从1
开始计数,即链表的尾节点是倒数第1
个节点。
例如,一个链表有6
个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6
。这个链表的倒数第3
个节点是值为 4
的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
2、思路
(链表) O ( n ) O(n) O(n)
由于单链表不能索引到前驱节点,所以只能从前往后遍历。
我们一共遍历两次:
第一次遍历得到链表总长度 n n n;
链表的倒数第 k k k 个节点,相当于正数第 n − k + 1 n−k+1 n−k+1 个节点。所以第二次遍历到第 n − k + 1 n−k+1 n−k+1 个节点,就是我们要找的答案。
注意当 k > n k>n k>n 时要返回 n u l l p t r nullptr nullptr。
时间复杂度
链表总共遍历两次,所以时间复杂度是 O ( n ) O(n) O(n)。
3、c++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
int n = 0;
for(auto p = head; p ; p = p->next) n++;
if(k > n) return NULL;
auto p = head;
for(int i = 0; i < n - k; i++) p = p->next;
return p;
}
};
4、java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int n = 0;
for(ListNode p = head; p!=null ; p = p.next) n++;
if(k > n) return null;
ListNode p = head;
for(int i = 0; i < n - k; i++) p = p.next;
return p;
}
}
最近一直在刷力扣题,计划是刷完500道力扣高频面试题,有想一起组队刷题的或者在刷题上有困惑的小伙伴可以加我微信或者QQ,免费答疑。备注算法学习即可。
微信:z13663570205
QQ:1622840727
如果我的文章对你有帮助的话,还请点个赞鸭!!!
以上是关于精选力扣500题 第33题 剑指Offer 22. 链表中倒数第k个节点c++ / java 详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第63题 剑指 Offer 36. 二叉搜索树与双向链表c++/java详细题解
精选力扣500题 第64题 LeetCode 101. 对称二叉树c++/java详细题解
精选力扣500题 第15题 LeetCode 33. 搜索旋转排序数组c++详细题解
精选力扣500题 第17题 LeetCode 33. 搜索旋转排序数组c++详细题解