本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出
题目描述
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
题目链接
题目分析
这道题有多种思路,且时间复杂度都是O(n)
,那么最终最优解的优化必然是在时间上常数级的优化以及空间上的优化,在时间上我们可以尽可能的遍历链表少一些,而在空间上我们可以做到O(1)
,思路就是使用双指针,让第一个指针先跑k个节点,假设总共n个节点,此时第一个指针还可以走n-k个节点,而让第二个指针从头开始,它们同时走的话,当第一个指针走到空,第二个指针刚好走到倒数第k个节点
解题代码
Python:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def kthToLast(self, head: ListNode, k: int) -> int:
t = k - 1
first = head
while t:
t -= 1
first = first.next
first = first.next
second = head
while first:
second = second.next
first = first.next
return second.val
Java:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int kthToLast(ListNode head, int k) {
int t = k-1;
ListNode first = head;
while(t -- > 0) first = first.next;
first = first.next;
ListNode second = head;
while(first != null){
first = first.next;
second = second.next;
}
return second.val;
}
}