两数相加(LeetCode题目) 史上最全解析!!!

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
# LeetCode自带的注释就是已经帮你定义好的,无需再定义
# # Definition for singly-linked list.(单链表的定义)
# # 定义链表节点类
# class ListNode:
#     def __init__(self, x):
#         self.val = x  # 当前节点的值
#         self.next = None   # 指向下一个节点(ListNode对象),需手动加入,默认为无


class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        re = ListNode(0)  # 初始化结果链表
        r = re  # 创建移动指针进行循环(保留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  # 相加后的数对10取整
            r.next = ListNode(s % 10)  # 对10取余构建下一个节点,即加法进位
            r = r.next    # 链表指针移动到最新一位(下一位)
            if(l1!=None): l1 = l1.next
            if(l2!=None): l2 = l2.next  # 遍历两个链表
        
        if(carry>0):
             # 如果两个链表最后相加的数大于10,则结果链表补一位,数值1
            r.next = ListNode(1) 
        
        return re.next  # 从链表头指针开始,返回链表

l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)
l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)

so = Solution()
s = so.addTwoNumbers(l1, l2)
while(s):
    print(s.val)
    s = s.next

 

你可能感兴趣的:(leetcode)