LeetCode 面试题 02.02. 返回倒数第 k 个节点

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

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

  注意:本题相对原题稍作改动

  点击此处跳转题目。

示例:

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

说明:

  • 给定的 k 保证是有效的。

二、C# 题解

  先遍历一遍求总结点数 n,再顺序寻找第 n - k + 1 个节点就可以了:

/**
 * 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 个:

/**
 * 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写题记录,leetcode,算法,职场和发展,c#)