程序员面试金典 - 面试题 02.02. 返回倒数第 k 个节点

题目难度: 简单

原题链接

今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

示例:

  • 输入: 1->2->3->4->5 和 k = 2
  • 输出: 4

说明:

给定的 k  保证是有效的。

题目思考

  1. 如何优化时间复杂度?

解决方案

思路
  • 一个很自然的想法是先遍历一遍整个链表, 统计节点数目 n, 然后再从头开始, 遍历到第 n-k 个节点即为所求
  • 但是上面做法需要遍历 n+(n-k) 个节点, 时间复杂度是 O(N+N-K), 效率不够高, 有没有办法只遍历 n 个节点就得出结果呢?
  • 答案也是有的, 我们可以利用双指针的思路, 使用一快一慢两个指针:
    • 快指针先遍历到第 k 个节点, 这个过程中慢指针不动
    • 然后慢指针再出发, 此时快慢指针每次都后移一位, 直到快指针达到终点, 显然此时慢指针指向的位置就是第 n-k 个节点
  • 利用这个优化, 时间复杂度就降低到了 O(N)
复杂度
  • 时间复杂度 O(N): 需要一次遍历所有节点
  • 空间复杂度 O(1): 只使用了几个常数空间的变量
代码
class Solution:
    def kthToLast(self, head: ListNode, k: int) -> int:
        # 快慢指针
        fast = head
        slow = head
        for _ in range(k):
            # 快指针先走k步, 慢指针不动
            fast = fast.next
        # 然后两者再一起走
        while fast:
            fast = fast.next
            slow = slow.next
        return slow.val

大家可以在下面这些地方找到我~😊

我的知乎专栏

我的头条号

我的 CSDN

我的 Leetcode

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值