Nemo的LeetCode学习笔记(2)

**

两数相加

**
题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
分析:
小编在学习数据结构的时候用伪码和C实现过链表的各种操作,但是拿到Python语言以后由于Python中没有指针这一概念,这道链表的题困扰了小编好久。最后还是求助了网上的教程才通过了这道题。
其实这道题本身并不难,只是现在动态语言中没有了指针这个概念,导致可能有的同学无从下手。
由于我们在做加法的时候是从个位加起,而本题中的链表是倒序的,表头正是个位,也就是两个表从表头开始依次向后遍历,对应位置做加法即可。
这里要注意的就是个位数相加可能会出现进位的情况,(0-9)+(0-9)最大的情况是9+9=18.所以’进位’这个变量最多为1。
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:
        if l1 is None:#若l1表为空则为0+l2表,直接返回l2
            return l2
        if l2 is None:若l2表为空则为l1表+0,直接返回l1
            return l1
        head = ListNode(0)#初始化头结点
        l = head#设置一个辅助指针为l
        carry = 0#初始化进位变量'carry'
        while l1 or l2 or carry:#当l1不为空或l2不为空或进位不为空时循环
            sum0 = carry#初始化'和'变量sum0 每次循环前使其等于上一轮的carry。达到进位的目的。
            carry = 0#carry在将上一轮的值交给sum0后重新置为0.
            if l1 is not None:#若l1尚未被遍历结束,取出val累和给sum0,并将指针指向下一节点。
                sum0 = sum0 + l1.val
                l1 = l1.next
            if l2 is not None:若l2尚未被遍历结束,取出val累和给sum0,并将指针指向下一节点。
                sum0 = sum0 + l2.val
                l2 = l2.next
            if sum0 >= 10:#如果求和大于等于10,则需要进位,将carry置为1,并给sum0-10。
                carry = 1
                sum0 = sum0 - 10
            l.next = ListNode(sum0)#将处理后的sum0付给一个新实例化的节点,并将该节点赋给指向上次循环的指针l的下一位。
            l = l.next#l向后移一位。
        return head.next#将从头结点的下一节点开始的链表返回。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值