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