原题链接:
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 = l1a1 = []while (head1):a1.append(head1.val)head1 = head1.nextprint "a1=",a1#遍历解析第2个数head2 = l2a2 = []while (head2):a2.append(head2.val)head2 = head2.nextprint "a2=",a2 #将第1个数组转成数字num1 = 0len1 = len(a1)for i in range(len1):# print "i=",inum1 += a1[i]*(10**i)print "num1=",num1 #将第2个数组转成数字num2 = 0len2 = len(a2)for i in range(len2):# print "i=",inum2 += a2[i]*(10**i)print "num2=",num2num = num1 + num2print "num=",num#特殊情况,直接返回if num == 0:node = ListNode(0)return node#将num转成数组a = []i = 1while (num != 0):temp = num % (10)num = num / (10)print "temp=",tempprint "num0=",numa.append(temp)i += 1print "a=",a#将数组转成链表node = ListNode(a[0])head = nodefor i in range(1,len(a)):newNode = ListNode(a[i])head.next = newNodehead = head.nexthead.next = Nonereturn node
复制代码
思路2代码:
#方法二:同时遍历两个链表,将对应位的数子相加。如果有进位就记录下来。def addTwoNumbers(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtyp"""#头结点head = None#当前节点currentNode = None#进位carry = 0#是否第一次遍历isFirst = Truewhile (l1 or l2 or carry != 0):#置0val1 = 0val2 = 0#计算val1if l1:val1 = l1.vall1 = l1.next#计算val2if l2:val2 = l2.vall2 = l2.next#计算val,注意进位也要加val = val1 + val2 + carry#大于10的时候表示有进位if (val/10 > 0):carry = 1val = val%10else:carry = 0#创建节点node = ListNode(val)if isFirst:#第一次创建节点做特殊处理currentNode = nodehead = currentNodeisFirst = Falseelse:currentNode.next = nodecurrentNode = currentNode.nextreturn head
复制代码
谦言忘语
个人目前只懂一丁点python语法,所以不做语法上的优化,而且整体代码风格效果会尽量跟C语言趋于一致。