题库-力扣
2.两数相加
https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
-
思路:
题中涉及的运算是数值相加,数据输入和输出都是以链表形式存在的,每个节点存放的是一位数字,数字的位数是按照逆序的方式存储的,因此可以考虑以计算加法竖式的思路来解决本题。
先构建一个链表用于存放输出值,当前节点存放的是个位数的值,后续节点存放的是更高位数的值。先将输入值的当前节点进行相加,和的个位数存放在输出链表的当前节点,十位数用于计算输出链表下一个节点的值;接下来就按照同样的思路计算下一个节点,在求节点和的时候要加上上一节点和的十位数;如此迭代直至两个输入链表的节点均穷尽,当仅有一个链表穷尽时可以给该链表补0值。当两个数最高位数的和是大于9时需要再增加一个数字的位数用于存放和的十位数。即当两个链表最后一次的和为两位数时,将其十位数存放在输出链表的下一个节点中。 -
代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
re = ListNode(0)
r=re
carry=0
while(l1 or l2):
x= l1.val if l1 else 0
y= l2.val if l2 else 0
s=carry+x+y
carry=s//10
r.next=ListNode(s%10)
r=r.next
if(l1!=None):l1=l1.next
if(l2!=None):l2=l2.next
if(carry>0):
r.next=ListNode(1)
return re.next #re的结构和r第一个节点的结构是一样的