Python中链表的两数相加(Add Two Numbers III)操作
题目描述:
给定两个非空链表,表示两个非负整数。每个节点只存储一个数字,并假设它们每位数字都是按照逆序方式存储的。将这两个数相加起来,并将以相同方式返回一个链表。你可以假设除数字 0 之外,这两个数字都不会以零开头。
示例:
输入:[2,4,3] + [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
思路:
遍历两个链表,将对应位置的值相加,存储到一个新的链表中。需要注意的是,在相加时需要考虑进位的情况。具体来说,若两个对应位置的值的和大于等于10,则当前结果中的位置应该为(和%10),同时还需要将进位值carry设置为1,表示下一位相加时需要加上1。若和小于10,则当前结果中的位置应该为(和+carry),carry设为0。另外还需要注意,当遍历两个链表时,若其中一个链表的位置已经到达了末尾,那么在计算结果时,只需要将另一个链表的值与carry相加即可,carry为0时无需相加。
代码实现:
需要定义一个ListNode类,如下所示:
class ListNode:
def init(self, val=0, next=None):
self.val = val
self.next = next
实现链表相加的函数addTwoNumbers,如下所示:
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(0) # 定义链表头
p = head # 定义指针p,初始化指向head
carry = 0 # 记录进位值
while l1 or l2:
x = l1.val if l1 else 0 # 若l1已经到达末尾,则将x置为0
y = l2.val if l2 else 0 # 若l2已经到达末尾,则将y置为0
temp = x + y + carry # 计算当前位的和
carry = temp // 10 # 计算进位值
p.next = ListNode(temp % 10) # 存储当前位的结果
p = p.next # 移动指针p
if l1:
l1 = l1.next # 遍历l1
if l2:
l2 = l2.next # 遍历l2
if carry > 0: # 最后需要判断是否还存在进位
p.next = ListNode(carry)
return head.next
测试:
实例化两个链表l1和l2,将其值分别初始化为[2,4,3]和[5,6,4]。将这两个链表作为参数传入addTwoNumbers函数中,函数将返回新的链表。
l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)
l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)
result = addTwoNumbers(l1, l2)
遍历结果链表,输出结果:
while result:
print(result.val, end=' ')
result = result.next
结果为7 0 8,符合预期。
相关文章