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

题目链接: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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容