leetCode刷题 2. 两数相加

1,126 阅读3分钟

原题链接:

leetcode-cn.com/problems/ad…

题目描述

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

题目解析:

题目的前提,将数字使用链接来存储,比如数字 123 ,储值为3->2->1。个位数在前,接着是十位、百位......。

要做的事情是:2个数字,都使用了链表来存储,我们需要将这两个数字相加,得到他们的和,将他们相加的结果存储成跟之前一样结构的链表。

需要做题者熟悉链表结构和链表的遍历。

思路

思路一:

链表毕竟是链表,无法直接简单地进行相加操作。所以比较容易想到的思路是,两个链表分别转化成数字,然后将两个数字相加,得到了和之后,再将结果转化成链表。

思路二:

由于是链表是个数在前,接着是十位、百位......所以可以同时遍历两个链表,然后将遍历出来的元素进行相加,将结果转化成新链表的元素。这样新链表就是题目所要求的链表。需要注意的事,相加可能会有进位出现,比如9+9=18,此时新元素应该是8,然后下一个元素的时候应该加上这个进位1。

代码(Python2)

思路一代码

 #方法一。将两个链接分别转成数组,然后转成数组,进行相加运算。得到的结果再转成数组,然后转成链表。
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        #遍历解析第1个数
        head1 = l1
        a1 = []
        while (head1):
            a1.append(head1.val)
            head1 = head1.next
        print "a1=",a1
        
        #遍历解析第2个数
        head2 = l2
        a2 = []
        while (head2):
            a2.append(head2.val)
            head2 = head2.next
        print "a2=",a2 
        
        #将第1个数组转成数字
        num1 = 0
        len1 = len(a1)
        for i in range(len1):
            # print "i=",i
            num1 += a1[i]*(10**i)
        print "num1=",num1    
        
        #将第2个数组转成数字
        num2 = 0
        len2 = len(a2)
        for i in range(len2):
            # print "i=",i
            num2 += a2[i]*(10**i)
        print "num2=",num2
        num = num1 + num2
        print "num=",num
        
        #特殊情况,直接返回
        if num == 0:
            node = ListNode(0)
            return node
        
        #将num转成数组
        a = []
        i = 1
        while (num != 0):
            temp = num % (10)
            num = num / (10)
            print "temp=",temp
            print "num0=",num
            a.append(temp)
            i += 1
        print "a=",a
        
        #将数组转成链表
        node = ListNode(a[0])
        head = node
        for i in range(1,len(a)):
            newNode = ListNode(a[i])
            head.next = newNode
            head = head.next
        head.next = None
        
        return node

思路2代码:

#方法二:同时遍历两个链表,将对应位的数子相加。如果有进位就记录下来。
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtyp
        """
        #头结点
        head = None
        #当前节点
        currentNode = None
        #进位
        carry = 0
        #是否第一次遍历
        isFirst = True

        while (l1 or l2 or carry != 0):
            #置0
            val1 = 0
            val2 = 0
            #计算val1
            if l1:
                val1 = l1.val
                l1 = l1.next
            #计算val2
            if l2:
                val2 = l2.val
                l2 = l2.next
            #计算val,注意进位也要加
            val = val1 + val2 + carry
            
            #大于10的时候表示有进位
            if (val/10 > 0):
                carry = 1
                val = val%10
            else:
                carry = 0
            
            #创建节点
            node = ListNode(val)
            
            if isFirst:
                #第一次创建节点做特殊处理
                currentNode = node
                head = currentNode
                isFirst = False
            else:
                currentNode.next = node
                currentNode = currentNode.next
              
        return head

谦言忘语

个人目前只懂一丁点python语法,所以不做语法上的优化,而且整体代码风格效果会尽量跟C语言趋于一致。