Leetcode刷题笔记——两数相加

题目描述:给出两 非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值