题目
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
Solution 1
链表分别转成数字,做加法后再转成链表。
# 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
按位加。
# 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