Leetcode_2:两数相加

题目描述:

给你两个 非空 链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示链表

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

Leetcode_2:两数相加_第1张图片

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

思路:

Leetcode_2:两数相加_第2张图片

代码:        

"""
@Project :study_python 
@File    :add two nums.py
@IDE     :PyCharm 
@Author  :chenwenlong
@Date    :2023/8/18 22:01 
"""


# Define single-linked list
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        # 判空
        if l1 is None:
            return l2
        if l2 is None:
            return l1

        # 准备头结点
        dummy = ListNode(0)
        carry = 0
        p = dummy

        # l1 和 l2 都不为空的时候进行运算
        while l1 and l2:
            # 加进位,注意要求余10,因为可能还会产生进位
            p.next = ListNode((l1.val + l2.val + carry)%10)
            # 计算进位
            carry = (l1.val + l2.val) // 10
            l1 = l1.next
            l2 = l2.next
            p = p.next

        # l2为空,l1不为空
        if l1:
            while l1:
                p.next = ListNode((l1.val + carry)%10)
                carry = (l1.val + carry) // 10
                p = p.next
                l1 = l1.next

        # l1为空,l2不为空
        if l2:
            while l2:
                p.next = ListNode((l2.val + carry)%10)
                carry = (l2.val + carry) // 10
                p = p.next
                l2 = l2.next
        if carry:
            p.next = ListNode(carry)
        return dummy.next


if __name__ == "__main__":
    a = Solution()
    listNode1 = ListNode(7)
    listNode2 = ListNode(0)
    ListNode3 = a.addTwoNumbers(listNode1, listNode2)
    print(ListNode3.val)
    

你可能感兴趣的:(算法,算法)