leecode两数相加的两种解法
问题描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
解决方法一:常规方法,只不过开始没理解题意,转来转去有点麻烦
class Solution:
def addTwoNumbers(self, l1, l2):
a1=[]
a2=[]
while(l1):#链表转列表
a1.append(l1.val)
l1=l1.next
while(l2):
a2.append(l2.val)
l2=l2.next
cin=0
a3=[]
len1=len(a1)
len2=len(a2)
if len1>len2:
len2,len1=len1,len2#判断长短,保持len1是短的一个
a1,a2=a2,a1
for x in range(len1):
a3.append(a2[x]+a1[x]+cin)
cin=a3[x]//10
a3[x]%=10
for x in range(len1,len2,1):
a3.append((a2[x]+cin))
cin=a3[x]//10
a3[x] %= 10
if cin==1:
a3.append(cin)
#新建两个空链表
tmp_node=ListNode(None)
node=ListNode(None)
#从后往前遍历和字符串,插入链表
str1=""
for x in a3[::-1]:
str1+=str(x)
for x in str1[::-1]:
# print(x)
if not tmp_node.val:
tmp_node.val=x
node=tmp_node
else:
tmp_node.next=ListNode(x)
tmp_node=tmp_node.next
return node
效果如下,好在还算是可以
方法二:这个方法直接用链表实现,省去了转换的步骤,代码精简了许多:
class Solution:
def addTwoNumbers(self, l1, l2):
list_head=ListNode(0)#头结点为0
list_now,cin=list_head,0 #cin 是进位
while l1 or l2:#只要有一个就继续
sum1=0
if l1 :
sum1=l1.val
l1=l1.next
if l2:
sum1+=l2.val
l2=l2.next
sum1+=cin
cin=sum1//10
sum1%=10
list_now.next = ListNode(sum1)
list_now=list_now.next
if cin==1:#对最后一位进位的处理
list_now.next=ListNode(cin)
return list_head.next
效果不错!