LeetCode | No.2 两数相加
题目描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
1 示例: 2 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 3 输出:7 -> 0 -> 8 4 原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
题目解析
本题是将两个链表形式的数字相加,计算结果也同样用链表来表示。链表在python中可以用类来描述,题中已经给出,其中包含数据域和指针域。关于链表在python中的实现我会再写一篇文章来阐述。对于本题来说数据在链表中的存储按逆序排列,也就是说链表的第一个节点就是数字的个位,依次为十位、百位等。两数相加完全可以按照小学列竖式加法来计算,也就是个位相加,向十位进位,以此类推。
需要注意的一点是,两个数字的位数不一定相等,那么可以先将存在的对应位相加,多出来的数位直接与进位相加即为结果。看程序会更容易理解一些。
1 # Definition for singly-linked list. 2 class ListNode: 3 def __init__(self, x): 4 self.val = x 5 self.next = None 6 7 class Solution: 8 def addTwoNumbers(self, l1, l2): 9 """ 10 :type l1: ListNode 11 :type l2: ListNode 12 :rtype: ListNode 13 """ 14 p = start = ListNode(-1) 15 carry = 0 16 while l1 and l2: 17 p.next = ListNode(l1.val + l2.val + carry) 18 carry = p.next.val // 10 19 p.next.val %= 10 20 p = p.next 21 l1 = l1.next 22 l2 = l2.next 23 res = l1 or l2 24 while res: 25 p.next = ListNode(res.val + carry) 26 carry = p.next.val // 10 27 p.next.val %= 10 28 p = p.next 29 res = res.next 30 if carry: 31 p.next = ListNode(carry) 32 return start.next
总体来说过程中主要分两部分,第一部分是对应位相加,再加上进位值(默认为0,即计算个位时),对10取余得到对应位的数字,赋值给新链表,对10取整得到进位值,赋值给carry;第二部分是判断出其中一个数字已经遍历完,那么用剩下数字与进位相加,赋值给新链表。
执行结果显示用时较长,内存消耗较小,有新的方法可以一起来讨论哈!
扫描二维码
获取更多精彩
小田学Python
作者:渔单渠 微信搜索“小田学Python”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.