题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的解答
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
# if l1.val == 0:
# return l2
# elif l2.val == 0:
# return l1
# else:
sum_l1_l2 = l1.val + l2.val
move,this_value = divmod(sum_l1_l2,10)
result = ListNode(val = this_value)
result_start = result
l1 = l1.next
l2 = l2.next
while True:
if l1 != None and l2 != None:
sum_l1_l2 = l1.val + l2.val + move
move,this_value = divmod(sum_l1_l2,10)
result_next = ListNode(val = this_value)
result.next = result_next
result = result.next
l1 = l1.next
l2 = l2.next
elif l1 == None and l2 != None:
sum_l1_l2 = l2.val + move
move,this_value = divmod(sum_l1_l2,10)
result_next = ListNode(val = this_value)
result.next = result_next
result = result.next
l2 = l2.next
elif l1 != None and l2 == None:
sum_l1_l2 = l1.val + move
move,this_value = divmod(sum_l1_l2,10)
result_next = ListNode(val = this_value)
result.next = result_next
result = result.next
l1 = l1.next
else:
if move == 1:
result.next = ListNode(val = 1)
return result_start
提交结果:
参考解答及思考
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = curr = ListNode()
carry = val = 0
#用while搭配两个if显著提高了代码的简洁度,而且逻辑更加清晰
while carry or l1 or l2:
#carry为0或1,可以直接加
val = carry
#当l1不等于None,l1=l1.next,val = val+l1.val。l2同理
#同时完成了被加数移位和加值的操作
if l1: l1, val = l1.next, l1.val + val
if l2: l2, val = l2.next, l2.val + val
#从加和分离出进位
carry, val = divmod(val, 10)
#将新的加和值形成链表节点,将上个节点的next指向新节点,将当前指针指向新节点
curr.next = curr = ListNode(val)
return head.next