两数相加

leetcode 第二题

两数之和
之前华为面试一面的原题,当时没有写出 bug-free 的代码,突然想起来这道题与硬件电路中的加法器设计类似,类比的写出了相应的解法,通过了 leetcode 测试。

# 整体思想是硬件电路设计中的一位加法器通过级联构成多位加法器

# 链表节点定义
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

# 两个一位十进制数相加(模拟硬件电路中的一位全加器)
# 输入: a, b, 两个一位十进制数
#       c, 低位进位
# 输出: (carry, result), (进位,(a+b+c) % 10)
def adder(a, b, c) -> (int, int):
    result = (a + b + c) % 10
    carry = 0 if (a + b + c) < 10 else 1
    return (carry, result)

# 两数之和
# 输入:l1, l2,两个非空链表,分别存储两个整数
# 输出:l3, l1 表示的数字和 l2 表示的数字相加的结果链表
# 如:l1 = 3->4->5, l2 = 3->6->3 则 l3 = 6->0->8
# l1 和 l2 的尾节点都不为 0(即所表示的数字不以 0 开头)
def addTwoNumbers(l1, l2) -> ListNode:
    # 头节点相加计算和及进位
    c, result = adder(l1.val, l2.val, 0)
    l3 = ListNode(result)
    pre = l3
    l3.next = ListNode(c)
    cur = l3.next
    l1 = l1.next
    l2 = l2.next

    while l1 or l2 or cur:
        # 较短的数字,高位用 0 补齐
        a = 0 if not l1 else l1.val
        b = 0 if not l2 else l2.val
        c, result = adder(a, b, cur.val)
        if not l1 and not l2:
            if cur.val == 0:
                pre.next = None
            return l3
        else:
            cur.val = result
            cur.next = ListNode(c)
        pre = pre.next
        cur = cur.next
        l1 = l1.next if l1 else l1
        l2 = l2.next if l2 else l2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值