LeetCode题目记录---两数相加(1)

LeetCode题目记录

题库-力扣

2.两数相加

https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

  1. 思路:
    题中涉及的运算是数值相加,数据输入和输出都是以链表形式存在的,每个节点存放的是一位数字,数字的位数是按照逆序的方式存储的,因此可以考虑以计算加法竖式的思路来解决本题。
    先构建一个链表用于存放输出值,当前节点存放的是个位数的值,后续节点存放的是更高位数的值。先将输入值的当前节点进行相加,和的个位数存放在输出链表的当前节点,十位数用于计算输出链表下一个节点的值;接下来就按照同样的思路计算下一个节点,在求节点和的时候要加上上一节点和的十位数;如此迭代直至两个输入链表的节点均穷尽,当仅有一个链表穷尽时可以给该链表补0值。当两个数最高位数的和是大于9时需要再增加一个数字的位数用于存放和的十位数。即当两个链表最后一次的和为两位数时,将其十位数存放在输出链表的下一个节点中。

  2. 代码:

# 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第一个节点的结构是一样的
    

猜你喜欢

转载自blog.csdn.net/weixin_41725746/article/details/88936333
今日推荐