递归:链表求和
Posted 我家大宝最可爱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归:链表求和相关的知识,希望对你有一定的参考价值。
面试题:链表求和
每一对儿的节点处理都是一样的,并且不断的向后遍历,因此看到这个问题的时候可以用循环也可以用递归。有一点不同的是,子问题的入参需要预先处理,即
- 先要求和
- 然后判断进位
- 将进位传递给子问题
还有一点非常有意思,一般情况下,一个链表遍历到None的时候,就直接返回了,例如l2
比l1
要短,因此肯定是先遍历完l2
,通常情况下只需要把l1
拼接起来即可,但是这里却是不断的补充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:
def add(l1,l2,carry):
if l1 is None and l2 is None and carry == 0: # 停止条件很有意思,一定要两个链表都遍历完,否者就补充0
return None
v1 = l1.val if l1 else 0
v2 = l2.val if l2 else 0
val = v1 + v2 + carry
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
node=ListNode(val%10)
node.next = add(l1,l2,val // 10)
return node
res = add(l1,l2,0)
return res
通常面对递归,我都会先思考子问题,然后根据子问题去求解原问题,这道题有两点不同
- 子问题的输入需要预先做处理,因此需要考虑子问题的入参,所以需要先处理再递归
- 子问题会返回子链表的head节点,因此需要next操作,即
node.next=add(l1,l2,c)
,并且需要返回原问题的节点return node
以上是关于递归:链表求和的主要内容,如果未能解决你的问题,请参考以下文章