给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:# 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
# 输出:7 -> 0 -> 8
# 原因:342 + 465 = 807
答案的思路是通过初等数学中的借位来进行计算,先获取 l1, l2 的确切数值,通过位数(个十百千万)来进行计算。算法复杂度为 O(m + n)其中 m 和 n 为 l1, l2 的位数。
----------------------------------------------------------------------------------------------------
#链表节点定义
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
#链表定义
class List(object):
def __init__(self):
self.head = None
self.length = 0
#头插法创建链表
def headInsert(self,data):
node = ListNode(data)
node.next = self.head
self.head = node
self.length = self.length+1
#尾插法创建链表(python变量赋值、引用、拷贝、浅拷贝)
def tailInsert(self,data):
node = ListNode(data)
if self.head==None:
self.head=node
else:
cur = self.head
while cur.next:
cur=cur.next
cur.next=node
self.length = self.length+1
#两数相加
class Solution(object):
# maybe standard version
def _addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
p = dummy = ListNode(-1)
carry = 0
while l1 and l2:
p.next = ListNode(l1.val + l2.val + carry)
carry = p.next.val / 10
p.next.val %= 10
p = p.next
l1 = l1.next
l2 = l2.next
res = l1 or l2
while res:
p.next = ListNode(res.val + carry)
carry = p.next.val / 10
p.next.val %= 10
p = p.next
res = res.next
if carry:
p.next = ListNode(1)
return dummy.next
#test创建链表
n1=List()
n2=List()
for i in range(1,5):
n1.headInsert(i)
for i in range(8,19):
n2.headInsert(i)
#创建的链表传入“两数相加函数”
s=Solution()
node1=n1.head
node2=n2.head
# 1,2,3,4;
# 8,9,10,11,12,13,14,15,16,17,18
# |>
# node1 = 4,3,2,1;
# node2 = 18,17,16,15,14,13,13,11,10,9,8
——————————————————————————————————————————————
print(s._addTwoNumbers(node1,node2).val)
# while l1.length!=0:
# if s._addTwoNumbers(node1,node2):
# print(s._addTwoNumbers(node1,node2).val)
# node1=node1.next
# node2=node2.next
# l1.length=l1.length-1
# else:
# break