leetcode 面試題 02.02. 返回倒數第 k 個節點 & 面試題22. 鏈表中倒數第k個節點

【題目】面試題 02.02. 返回倒數第 k 個節點

實現一種算法,找出單向鏈表中倒數第 k 個節點。返回該節點的值。

注意:本題相對原題稍作改動

示例:

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

說明:
給定的 k 保證是有效的。

【解題思路1】快慢指針

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int kthToLast(ListNode head, int k) {
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null){
            fast = fast.next;
            if(k > 0){
                k--;
            }else{
                slow = slow.next;
            }
        }
        return slow.val;
    }
}

【解題思路2】遞歸

// 遞歸
class Solution {
    // 開始全局變量 K 保持不變
    int K = 1;
    public int kthToLast(ListNode head, int k) {
        // 當節點在最末尾時觸發返回
        if (head.next == null) return head.val;
        // 返回的值
        int val = kthToLast(head.next, k);
        // 一旦觸發返回,從第一個產生返回的位置用 K 計數
        if (K++ >= k) {
            // 當到達或超過倒數第 k 時,即 K >= k 時保持返回值不變
            return val;
        } else {
            // 沒到達則更新需要返回的值
            return head.val;
        }
    }
}

【題目】 面試題22. 鏈表中倒數第k個節點

輸入一個鏈表,輸出該鏈表中倒數第k個節點。爲了符合大多數人的習慣,本題從1開始計數,即鏈表的尾節點是倒數第1個節點。例如,一個鏈表有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鏈表的倒數第3個節點是值爲4的節點。

示例:

給定一個鏈表: 1->2->3->4->5, 和 k = 2.

返回鏈表 4->5.

和上題的區別是直接return slow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章