📅  最后修改于: 2023-12-03 15:26:39.152000             🧑  作者: Mango
在处理链表数据结构时,有时需要找到最后 n 个节点的总和。这可以通过遍历链表两次完成,但是效率会比较低。本文将介绍两种快速的方法来查找给定链表的最后 n 个节点的总和。
可以使用两个指针来遍历链表。第一个指针先遍历 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)。
另一种查找链表最后 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 个节点的总和。双指针的方法更快,但需要额外的指针变量来跟踪遍历状态。递归的方法更简洁,但需要额外的堆栈空间来存储递归调用。对于小型数据集,这两种方法都可以使用。对于大型数据集,双指针的方法更适合。