LeetCode 「简单」LCR140.训练计划 II

sankigan2025-3-5算法LeetCode

训练计划 IIopen in new window

题目描述

给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。

示例

输入:head = [2,4,7,8], cnt = 1
输出:8

解答

双指针法

关键思路

双指针法的核心思想是使用两个指针,fastslow,他们之间的距离始终保持为 cnt。当 fast 指针到达链表末尾时,slow 指针刚好指向倒数第 cnt 个节点。

具体步骤

  1. 初始化指针
  • 初始化两个指针 fastslow,都指向链表的头节点 head
  1. 移动 fast 指针
  • fast 指针向前移动 cnt 步。如果在移动过程中 fast 指针提前到达链表末尾(即 fast 变为 null),说明链表长度小于 cnt,直接返回 null
  1. 同时移动两个指针
  • fast 指针到达链表末尾时,slow 指针将指向倒数第 cnt 个节点
  • 在移动过程中,每次将 fastslow 指针同时向前移动一步,直到 fast 指针到达链表末尾
  1. 返回结果
  • fast 指针到达链表末尾时,slow 指针所指向的节点即为倒数第 cnt 个节点
Code
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} cnt
 * @return {ListNode}
 */
var trainingPlan = function(head, cnt) {
  let slow = head, fast = head;

  // 先将 fast 指针向前移动 cnt 步
  for (let i = 0; i < cnt; ++i) {
    // 如果链表长度小于 cnt,返回 null
    if (!fast) return null;
    fast = fast.next;
  }

  // 同时移动 fast 和 slow 指针,直到 fast 到达链表末尾
  while (fast) {
    fast = fast.next;
    slow = slow.next;
  }

  // 此时 slow 指针指向倒数第 cnt 个节点
  return slow;
};
更新于 2025/3/5 17:20:08