题目描述:给出两 非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路:按照逆序的方法存储实际上有利于我们编码,逆序存储我们可以从头遍历两个列表求和,相当于一般意义上的从个位相加。对于计算机中的加法,应该有数值位和进位两个部分,数值位为两数求和后取模,进位为两数求和后除10。此外应考虑l1和l2不等长的问题,以及两数最高位相加后仍可能存在向前进位的问题。具体实现如下:
# 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:
res=p=ListNode(list) #res、p均为值位空的头节点
s=0 #求和过程中的进位
while l1 or l2: #当l1或者l2不为空
x=l1.val if l1 else 0 #取val,若为空则取为0
y=l2.val if l2 else 0
sum=x+y+s #单位相加求和
s=sum//10 #求进位
p.next = ListNode(sum % 10) #以sum%10为数值位,在结果链表中申请一个新的结点
p=p.next
l1=l1.next if l1 else None #遍历,如果不空则指向下一个结点
l2=l2.next if l2 else None
if s!=0: #判断最高位是否仍有进位
p.next = ListNode(1) #若有,以1为数值位,在结果链表中申请一个新的结点
return res.next #返回结果链表
解题过程中的debug笔记:
1.x=l1.val if l1 else 0 #python的高效体现,注意if else
2.l1=l1.next if l1 else None #同上,区别else后面根据我们需要应添加的东西
3.return res.next #这里res是值位空的头节点,res.next就是我们求和后的链表
提交结果:
此处分享一个Leetcode中python3题解第一的代码,思路一致但他的代码风格非常简洁,值得学习。
# 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 = p = ListNode(None)
s = 0
while l1 or l2 or s:
s += (l1.val if l1 else 0) + (l2.val if l2 else 0)
p.next = ListNode(s % 10)
p = p.next
s //= 10
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return dummy.next
作者:meng-zhi-hen-n
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/zui-zhi-bai-de-xie-fa-by-meng-zhi-hen-n-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大佬的提交结果:
补充:因为后面要大量用py编码,用leetcode题目来熟悉语言,所以笔记针对的都是自己存在的问题,目前py小白。
2020.6.17 gohna完成