剑指 Offer 22. 链表中倒数第k个节点

297 阅读1分钟

题目描述

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。 这个链表的倒数第 3 个节点是值为 4 的节点。

示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.

解题思路: 快慢指针法

  1. 定义快慢2个指针, 慢指针指向head, 快指针指向head后的第k个元素 (也就是快慢指针相差k)
  2. 快慢指针同时往后移动, 直到快指针到链表结尾
  3. 因为快慢指针相差k, 快指针在结尾, 那么慢指针就在结尾的倒数k位置, 返回慢指针 时间复杂度: O(n)

示例代码

def getKthFromEnd(head: helper.ListNode, k: int) -> helper.ListNode:
    h1, h2 = head, head
    while k > 0:  # 步骤1
        h2 = h2.next
        k -= 1

    while h2: # 步骤2
        h1 = h1.next
        h2 = h2.next

    return h1