一、题目
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
点击此处跳转题目。
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
- 给定的 k 保证是有效的。
二、C# 题解
先遍历一遍求总结点数 n,再顺序寻找第 n - k + 1 个节点就可以了:文章来源:https://www.toymoban.com/news/detail-674447.html
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public int KthToLast(ListNode head, int k) {
int n = 0;
ListNode p = head;
// 先遍历一遍求总结点数 n
while (p != null) {
p = p.next;
n++;
}
// 顺序寻找第 n - k + 1 个节点
while (n > k) {
head = head.next;
n--;
}
return head.val;
}
}
- 时间复杂度: O ( n ) O(n) O(n),两次遍历。
- 空间复杂度: O ( 1 ) O(1) O(1)。
当然这么做有点傻,需要两次遍历。因此使用两个间隔为 k 的指针齐头并进,后面的指针到末端,前面的指针指向倒数第 k 个:文章来源地址https://www.toymoban.com/news/detail-674447.html
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public int KthToLast(ListNode head, int k) {
ListNode p = head, q = p; // 双指针
while (k-- > 0) q = q.next; // q 在 p 的后面第 k 个
// p、q 同时前进,q 到终点时,p 指向 倒数第 k 个
while (q != null) {
q = q.next;
p = p.next;
}
return p.val;
}
}
- 时间复杂度: O ( n ) O(n) O(n),一次遍历。
- 空间复杂度: O ( 1 ) O(1) O(1)。
到了这里,关于LeetCode 面试题 02.02. 返回倒数第 k 个节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!