📌  相关文章
📜  查找给定链表的最后 n 个节点的总和(1)

📅  最后修改于: 2023-12-03 15:26:39.152000             🧑  作者: Mango

查找给定链表的最后 n 个节点的总和

在处理链表数据结构时,有时需要找到最后 n 个节点的总和。这可以通过遍历链表两次完成,但是效率会比较低。本文将介绍两种快速的方法来查找给定链表的最后 n 个节点的总和。

方法1:使用双指针

可以使用两个指针来遍历链表。第一个指针先遍历 n 个节点,然后第二个指针开始遍历,直到第一个指针到达链表的末尾。此时,第二个指针所指向的节点就是需要求和的链表的最后 n 个节点。遍历这些节点并计算它们的总和即可。

下面是这种方法的代码片段:

def sum_last_n_nodes(head, n):
    # 初始化双指针
    p1 = head
    p2 = head
    # 第一个指针先遍历前 n 个节点
    for i in range(n):
        if p1:
            p1 = p1.next
        else:
            return 0  # 如果链表长度小于 n,则返回 0
    # 两个指针同时遍历链表,直到第一个指针到达末尾
    while p1:
        p1 = p1.next
        p2 = p2.next
    # p2 指向的节点即为需要求和的最后 n 个节点
    total = 0
    while p2:
        total += p2.val
        p2 = p2.next
    return total

这个函数的时间复杂度是 O(n),其中 n 是链表的长度。空间复杂度是 O(1)。

方法2:使用递归

另一种查找链表最后 n 个节点的方法是使用递归。递归访问链表直到末尾,然后再从末尾开始向前计数,累加需要求和的节点的值。

下面是这种方法的代码片段:

def sum_last_n_nodes(head, n):
    if not head:
        return 0
    total = sum_last_n_nodes(head.next, n)
    if n > 0:
        total += head.val
    return total

这个函数的时间复杂度同样是 O(n),空间复杂度是 O(n),因为递归调用是需要堆栈空间的。

总结

使用双指针和递归都可以快速地查找链表的最后 n 个节点的总和。双指针的方法更快,但需要额外的指针变量来跟踪遍历状态。递归的方法更简洁,但需要额外的堆栈空间来存储递归调用。对于小型数据集,这两种方法都可以使用。对于大型数据集,双指针的方法更适合。