您的位置:首页 > 其它

【LeetCode-2】 两数相加 (链表)

2018-09-10 17:31 295 查看

题目

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

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

 

Solution 1

链表分别转成数字,做加法后再转成链表。

[code]# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
def l_add(node, data):
node.next = ListNode(data)
tmp = node.next
return tmp

def l_read(data):
num = 0
i = 0
while data:
num = num + data.val*10**i
i = i + 1
data = data.next

return num

a = l_read(l1)
b = l_read(l2)
result = a + b
print(str(result))
# r = ListNode(0)
for i in range(len(str(result))):
tmp = int(result/10**i)%10
if i==0:
r = ListNode(tmp)
r1 = r
else:
r1 = l_add(r1, tmp)
# print(str(r))

return r

结果:和的结果正确,但转成链表时出错。位数太多无法正确计算除法。

注意:

新建链表节点,返回整个链表

a1.next=a2

a2.next=a3

...

return a1

Solution 2

按位加。

[code]# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
carry = 0
cnt = 0
while True:
if not l1:
l1=ListNode(0)
if not l2:
l2=ListNode(0)
tmp = l1.val + l2.val + carry

if tmp>=10:
carry = 1
else:
carry = 0

a = tmp%10

if cnt==0:
r = ListNode(a)
r1 = r
else:
r1.next = ListNode(a)
r1 = r1.next

cnt=cnt+1
if (l1.next==None) and (l2.next==None) and (carry==0):
break
l1=l1.next
l2=l2.next
return r

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: