给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
下面的这部分代码是自己写的,用的是比较传统的方法,就是将链表翻转,求和再翻转回去。思路算是比较简单,但是在操作的过程中也遇到一些问题,链表的操作,在笨的测试的时候费了一些功夫。中途在进行n次方计算的时候,最初用的是math.pow()的方法,发现在计算过程中总是会自动转换成科学计数法的方式来表达数字,这对后面的加和产生了一些影响。查找解决办法的时候有一些numpy的改进方法,发现对于自己的问题并不是很实用,后来直接转换了10**i这样的方式,发现解除了科学计数法的一些弊端。(148ms)
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def addTwoNumbers(self,l1, l2): ll1=Solution.getVal(l1) ll2=Solution.getVal(l2) ll4 = list(str(ll1+ll2)) ll4.reverse() l3=ListNode(int(ll4[0])) l4=l3 #重组链表 for i in range(1,len(ll4)): l3.next=ListNode(int(ll4[i])) l3 = l3.next return l4 #将链表加和 def getVal(l1): ll1=0 i=0 while l1.next!=None: ll1+=int(l1.val*(10**i)) i=i+ 1 l1=l1.next ll1+=l1.val*(10**i) return ll1 def linkList(l1): lenl=len(l1) link1 = ListNode(l1[0]) link2 = link1 for i in range(1,lenl): link2.next=ListNode(l1[i]) link2 = link2.next return link1 list1 = [2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9] list2 = [5,6,4,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9,9,9,9] l1 = linkList(list1) l2 = linkList(list2)
官方题解的方式是有设计一个标志位,对于进位进行记录,并且对下一步的计算进行补加,代码如下(156ms):
class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ re = ListNode(0) r=re carry=0 while(l1 or l2): x= l1.val if l1 else 0 y= l2.val if l2 else 0 s=carry+x+y carry=s//10 r.next=ListNode(s%10) r=r.next if(l1!=None):l1=l1.next if(l2!=None):l2=l2.next if(carry>0): r.next=ListNode(1) return re.next