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

发布于:2024-12-18 ⋅ 阅读:(58) ⋅ 点赞:(0)

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

开始的思路 :先白遍历整个链表 然后把链表元素入栈 接着出栈k - 1 次 栈顶元素就是所求

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        stack<int> stk;
        while (head) {
            stk.push(head->val);
            head = head->next;
        }
        for ( int i = 0; i < k - 1; ++i ){
            stk.pop();
        }
        return stk.top();
    }
};

这样子 时间复杂度和空间复杂度都是O(N)的 空间消耗看着有点大

那我们就没办法了吗 有

因为所求的位置是 倒数第 k 个节点 我们可以利用双指针 定义两个指针先指向头节点 然后让一个指针先往前走k次 那么两个指针相差的位置就是k 当前面的指针走出链表 也就是指向了NULL 那么后面的指针就是指向 倒数第 k 个节点  这样子只需消耗两个指针的空间

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        ListNode *pre = head, *curr = head;
        for ( int i = 0; i < k; ++i ){
            curr = curr->next;
        }
        while ( curr ){
            pre = pre->next;
            curr = curr->next;
        }
        return pre->val;
    }
};

k神图解

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)


网站公告

今日签到

点亮在社区的每一天
去签到