递归:链表求和

Posted 我家大宝最可爱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归:链表求和相关的知识,希望对你有一定的参考价值。

面试题:链表求和

每一对儿的节点处理都是一样的,并且不断的向后遍历,因此看到这个问题的时候可以用循环也可以用递归。有一点不同的是,子问题的入参需要预先处理,即

  1. 先要求和
  2. 然后判断进位
  3. 将进位传递给子问题


还有一点非常有意思,一般情况下,一个链表遍历到None的时候,就直接返回了,例如l2l1要短,因此肯定是先遍历完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

通常面对递归,我都会先思考子问题,然后根据子问题去求解原问题,这道题有两点不同

  1. 子问题的输入需要预先做处理,因此需要考虑子问题的入参,所以需要先处理再递归
  2. 子问题会返回子链表的head节点,因此需要next操作,即node.next=add(l1,l2,c),并且需要返回原问题的节点return node

以上是关于递归:链表求和的主要内容,如果未能解决你的问题,请参考以下文章

递归:链表求和

递归:单链表求和

递归:单链表求和

递归与链表

算法--递归

递归:解题思路