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

         
                   

posted @ 2020-02-12 10:18  小田学Python  阅读(440)  评论(0编辑  收藏  举报