美文网首页算法
剑指 Offer 22. 链表中倒数第k个节点

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

作者: 秃头哥编程 | 来源:发表于2021-03-13 18:16 被阅读0次

    题目链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/

    • 笨方法:第一次循环算出链表的长度,长度和k相减就能得到是第几个节点。优点是容易想到,缺点是需要循环两次。最坏的情况就是K等于1的时候,需要完全遍历两次,复杂度2 O(N)
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            int len = 0;
            ListNode temp = head;
            while (temp != null) {
                len++;
                temp = temp.next;
            }
            
            temp = head;
            int index = len - k;
            while (index-- > 0) {
                temp = temp.next;
            }
    
            return temp;
        }
    }
    
    • 聪明的方法:使用快慢指针,复杂度O(N)。
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            ListNode frontNode = head, behindNode = head;
    
            // 先走k个节点,剩下就还有len - k个节点
            while (k-- > 0) {
                frontNode = frontNode.next;
            }
    
            // 这里其实就是移动len - k个节点,刚好是倒数第K个节点
            while (frontNode != null) {
                frontNode = frontNode.next;
                behindNode = behindNode.next;
            }
    
            return behindNode;
        }
    }
    

    但两种题解执行结果好像并没有什么差别。


    image.png

    相关文章

      网友评论

        本文标题:剑指 Offer 22. 链表中倒数第k个节点

        本文链接:https://www.haomeiwen.com/subject/oiwxcltx.html