原题链接:
题目描述
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 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语言趋于一致。