返回

用LeetCode 剑指Offer 22题解开算法刷题之门

前端

算法入门,从LeetCode剑指Offer开始

作为程序员进阶必经之路,算法刷题是提升编码能力的有效途径。而LeetCode作为算法练习的殿堂,汇集了海量题目,其中剑指Offer系列更是专为中国程序员量身打造。22题——链表中倒数第k个节点,正是剑指Offer中一道经典题目,旨在考察链表操作和时间复杂度分析的基本功。

题目寻找链表中的倒数第k个节点

给定一个链表和一个整数k,请返回链表中倒数第k个节点。如果不存在倒数第k个节点,则返回null。

解题思路:直捣黄龙,从尾到头巧妙解决

要解决这道题目,关键在于巧妙地将倒数第k个节点转换为正数第n-k个节点。具体来说,我们可以采取以下两种思路:

思路一:两趟遍历,简单粗暴但效率不佳

步骤:

  1. 遍历链表,获取链表长度n。 时间复杂度O(n)。
  2. 再次遍历链表,从正数第n-k个节点开始返回。 时间复杂度O(n)。

时间复杂度: O(2n) = O(n)。

空间复杂度: O(1)。

思路二:一箭双雕,一次遍历高效解决

步骤:

  1. 定义两个指针p和q,p先走k步。
  2. 然后p和q同时遍历链表,直到p到达末尾。
  3. 此时q所指节点即为倒数第k个节点。

时间复杂度: O(n)。

空间复杂度: O(1)。

代码实现:用Python征服LeetCode

def get_kth_from_end(head, k):
    """
    :type head: ListNode
    :type k: int
    :rtype: ListNode
    """
    p = head
    q = head

    # p先走k步
    for _ in range(k):
        p = p.next
        if not p:
            return None

    # p和q同时遍历链表
    while p:
        p = p.next
        q = q.next

    return q

总结:算法刷题,贵在勤学苦练

通过对LeetCode剑指Offer 22题的详细解析,相信你已经对链表操作和时间复杂度分析有了更深入的理解。算法刷题是一项长期而艰巨的任务,贵在勤学苦练,持之以恒。只要你坚持不懈,不断总结,终将成为算法高手。

LeetCode的题海浩瀚无垠,等待着你的探索。拿起键盘,继续你的刷题之旅吧!