LeetCode 两数相加

两数相加


题目


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

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

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

示例如下:

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

解题思路


  • 链表
  • 对两个链表进行遍历。若两个链表,其中一个链表较短,则补 0 当成相同链表进行操作。
  • 计算时,需要考虑进位的问题,每次计算需要重新更新进位值。
  • 若遍历结束,进位值为 1,则需要在返回新链表中的最前添加节点 1。
  • 使用哑节点,可以跳过对空节点的检查。同时哑节点也充当预先指针,该指针的下一个节点指向真正的头结点 head。使用预先指针是为了防止链表构造移动指针时,导致指针丢失,无法返回结果。

代码实现


# 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:
        # 定义哑节点,同时设预先指针
        dummy = ListNode(0)
        # 用于移动节点
        cur = dummy
        # 进位值
        carry = 0

        while l1 or l2:  # 两链表为 null,遍历结束
            # 判断节点,为 null 则补 0,
            a = l1.val if l1 else 0
            b = l2.val if l2 else 0
            
            # 计算对应数之和
            two_sum = a + b + carry
            # 更新进位值
            carry = two_sum // 10
            
            # 移动节点
            cur.next = ListNode(two_sum % 10)
            cur = cur.next
            if l1 != None:
                l1 = l1.next
            if l2 != None:
                l2 = l2.next
        
        # 进位值为 1,在最前添加节点 1
        if carry > 0:
            cur.next = ListNode(1)
        
        # 返回哑节点下一个节点,为结果链表真正头结点
        return dummy.next  

实现效果



以上就是本篇的主要内容。


欢迎关注『书所集录』公众号
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值