一道关于链表的题

题目简述:【其实就是从leetcode里面抄过来的题】

给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807


解题思路:

如果链表但长度是给定的话,我们可以将链表里的数字拿出来组合成一个数字来进行相加,相加之后对于输出的结果,通过/10的方式依次取出。但是链表的长度是未知的,所以我们不能用这么取巧的方式来解题。【个人想法,我看到有个大神确实这样做了,是我狭隘了,其实是一样的递归思路】

其实我看到之后也是没思路的,是参考了大家的解题方法,现在只是为了记录一下,加深自己的印象。

还是一位一位去相加,如果有进位就同步到下一位上,由于链表可以通过.next拿到下一个节点的值,所以我们可以用到递归,只用写第一位的加法规则,每一个next都进行套用,最后输出结果。



链表的定义:

链表是由一个个节点组合起来的一个数据链,抽象出来的结构如下图,转自https://www.cnblogs.com/king-ding/p/pythonchaintable.html。这里十分详细,还讲了列表的创建和操作,十分适合我这种小白0 0


代码实现:

```

# Definition for singly-linked list.

# class ListNode:

#     def __init__(self, x):

#         self.val = x

#         self.next = None

class Solution:

    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:

        return self.addtwo(l1,l2)

    def addtwo(self,l1,l2,sum=0):

        if not l1 and not l2 and sum==0:

            return None       #这里一定不能写成NULL

        l1_val = l1.val if l1 else 0   #这里的三目运算符,意思是如果l1不为空,就取它的值,否则就是0

        l2_val = l2.val if l2 else 0

        l1_next= l1.next if l1 else None #这里是取下一个节点

        l2_next= l2.next if l2 else None

        sum1 = l1_val + l2_val + sum

        if sum1 >= 10:

            result = ListNode(sum1 -10 )

            result.next = self.addtwo(l1_next,l2_next,1)

        else :

            result = ListNode(sum1)

            result.next = self.addtwo(l1_next,l2_next)

       return result

```


你可能感兴趣的:(一道关于链表的题)