我们有两个单链表;因此,我们只能在单个方向上遍历结构。此外,我们只能访问链接列表的头部。该算法的目标是对两个链表的数字求和,并生成具有答案的第三个数字。例如,给定617 + 295 = 912,链接列表[6,1,7] + [2,9,5]应产生结果[9,1,2]。
为简单起见,我们假设原始列表的长度相同。同样,我没有实现链表数据结构。相反,我使用的是Python的内置列表,但将它们视为链接列表。
我想出的解决方案如下(Python代码)
def sum_lists(l1, l2):
lista = []
carry = sum_forward(l1, l2, 0, lista)
if carry > 0:
lista.insert(0, carry)
return lista
def sum_forward(l1, l2, index, lista):
if index == (len(l1)):
return 0
total = l1[index] + l2[index] + sum_forward(l1, l2, index + 1, lista) #here
#we have the iterative call.
carry = total // 10
value = total % 10
lista.insert(0, value) #This way we create a new head for the "surrogate
#linked-list" and append to it the resto of the values
return carry
虽然此解决方案可以正常工作,但我听说任何递归解决方案都可以转换为迭代解决方案。我一直在努力奋斗几天,但无法将其更改为迭代解决方案。
我知道这可以通过很多方法解决;但是,这真的可以变成迭代解决方案吗?
谢谢大家!
我在盖尔·拉克曼·麦克道威尔(Gayle Laakmann Mcdowell)的巨著《破解编码采访》中找到了链接表的最初问题。
答案 0 :(得分:0)
这是一种迭代解决方案:
l1 = [6,1,7]
l2 = [2,9,5]
def iterative_sum(l1, l2):
maxlength = max(len(l1), len(l2))
lsum = []
sup = 0
for i in range(maxlength):
if l1 and l2:
sup, num = divmod(l1.pop() + l2.pop() + sup, 10)
elif l1 or l2:
lleft = l1 or l2 # this assigns lleft to one of l1, l2 that still had element
sup, num = divmod(lleft.pop() + sup, 10)
lsum.append(num)
return lsum[::-1]
iterative_sum(l1, l2)
# [9, 1, 2]