【LeetCode刷题】NO.21---剑指 Offer 22. 链表中倒数第k个节点

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

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

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例:

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

返回链表 4->5.
复制代码

二、思路分析:

这是一道难度为简单offer题目,基本上看到题目思路就很清晰,一种比较没有技巧的解法就是利用for循环一直将指针遍历到了链表的尾部,然后再利用for循环让指针指向倒数第K个节点即可完成本题的解答。 但是这样解答出来的题目没有任何技巧可言,可能对于面试官来说你的这种解法在他看来并不是那么满意,所以需要对这个解法进行改良一下。我们需要将一个指针走K步,然后再创建一个指针指向头节点,随后让两个指针一起走,直到第一个指针走到了尾部为空的时候,它就完整走过了n步,而第二个指针刚好走了n-k步符合题目的要求,只需要返回第二个指针即可。

image.png

三、代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var getKthFromEnd = function(head, k) {
    let p1 = head
    let p2 = head
    for(let i=0 ; i<k ; i++){
        p1 = p1.next
    }
    while(p1){
        p1 = p1.next
        p2 = p2.next
    }
    return p2
};
复制代码

四、总结:

这道题也没有什么值得总结的点,主要还是需要了解倒数第k步的那个思路,注意一下返回值即可。

猜你喜欢

转载自juejin.im/post/7074875783579189262