给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
算法逻辑
对于这道题来讲,只要可以将链表当成数组来用,那么90%的问题可以说已经被解决了
我们知道,在数组中,下标代表着数组内数的位置(这里不指地址),并且我们可以通过这个特性可以很轻松的将下标位置所表示的数输出出来,也就是说我们的链表能够表示元素在链表中的位置,能够返回链表长度那么大部分问题可以说是已经解决了
代码实现
第一步
len() = 返回链表长度
count = 已遍历的元素个数
遍历链表直至链表最后一个元素并且返回遍历了多少个元素即可
def len(self):
count = 1
if self.head == None:
return
else:
current = self.head
while current.next:
current = current.next
count += 1
return count
第二步
value(num) = 返回指定元素的值
遍历链表元素直到遍历完第num个元素即可
def value(self,num):
if self.head == None:
return
else:
count = 0
current = self.head
while count < num:
current = current.next
count += 1
return current.data
第三步
fun(input_0,input_1) = 数学操作,input_0与input_1为要“相加”的两个链表
这里解释一下如何才让[2,4,3]变成342
首先遍历链表[2,4,3],以for循环为例,
i == 0时输出为2
i == 1时输出为4
i == 2时输出为3
只需将输出的数字乘以10的i次方即可,即:
i == 0是输出2 -> 2 * (10 ** 0) == 2
i == 1是输出4 -> 4 * (10 ** 1) == 40
i == 2是输出3 -> 3 * (10 ** 2) == 300
然后相加即可得到342
result = linked_list()
tmp_0 = 0
tmp_1 = 0
for i in range(input_0.len()):
tmp_0 = tmp_0 + input_0.value(i) * (10 ** (input_0.len() - i - 1))
for i in range(input_1.len()):
tmp_1 = tmp_1 + input_1.value(i) * (10 ** (input_1.len() - i - 1))
同样的我们也可以逆向操作将342变成[2,4,3]
首先,我们得确认要取到几位数,342看起来像342,但实际上342可以是0342也可以是00324又可以是000000000000342(有点夸张了吧,这里不是16进制表示),所以当我们确认342被10除以几次之后不可以再被10相除
然后进行取模运算342 % 10即可得到2,再进行342 // 10的操作的到34,返回到34 % 10可以得到4......以此类推就可以得到[2,4,3]咯
while tmp // 10 != 0:
result.insert(tmp % 10)
tmp = tmp // 10
result.insert(tmp % 10)
return result
完整代码
class node:
def __init__(self,data):
self.data = data
self.next = None
class linked_list:
def __init__(self):
self.head = None
def insert(self,data):
new_node = node(data)
if self.head == None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def len(self):
count = 1
if self.head == None:
return
else:
current = self.head
while current.next:
current = current.next
count += 1
return count
def value(self,num):
if self.head == None:
return
else:
count = 0
current = self.head
while count < num:
current = current.next
count += 1
return current.data
def display(self):
if self.head == None:
return
else:
current = self.head
while current.next:
print(current.data,end = "->")
current = current.next
print(current.data)
def fun(input_0,input_1):
result = linked_list()
tmp_0 = 0
tmp_1 = 0
for i in range(input_0.len()):
tmp_0 = tmp_0 + input_0.value(i) * (10 ** (input_0.len() - i - 1))
for i in range(input_1.len()):
tmp_1 = tmp_1 + input_1.value(i) * (10 ** (input_1.len() - i - 1))
tmp = tmp_0 + tmp_1
while tmp // 10 != 0:
result.insert(tmp % 10)
tmp = tmp // 10
result.insert(tmp % 10)
return result
list_0 = linked_list()
list_0.insert(2)
list_0.insert(4)
list_0.insert(3)
list_1 = linked_list()
list_1.insert(5)
list_1.insert(6)
list_1.insert(4)
print("相加前为:")
list_0.display()
list_1.display()
print("相加后为:")
fun(list_0,list_1).display()
list_2 =linked_list()
list_2.insert(9)
list_2.insert(9)
list_2.insert(9)
list_2.insert(9)
list_2.insert(9)
list_2.insert(9)
list_2.insert(9)
list_3 = linked_list()
list_3.insert(9)
list_3.insert(9)
list_3.insert(9)
list_3.insert(9)
print("相加前为:")
list_2.display()
list_3.display()
print("相加后为:")
fun(list_2,list_3).display()
上述代码的时间复杂度为O(n),评论区留下你的建议及意见,博主会第一时间更新文章