Python 两数相加(链表)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 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),评论区留下你的建议及意见,博主会第一时间更新文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值