题目简述:【其实就是从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
```