LeetCode #2 - Add Two Numbers 递归实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode #2 - Add Two Numbers 递归实现相关的知识,希望对你有一定的参考价值。

难度为medium,注意处理好边界情况。

题目描述:给你两个非空链表,代表两个非负整数。数位按倒序存储,链表的每个节点只包含单个数字。求这两个数的和,结果以链表形式返回。你可以认为这两个数不会以0开头,除了0本身。

样例:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

读完第一遍题目,第一反应是:输入链表,反向,转化为整数类型,求和,再转换为链表。看着样例才反应过来,干嘛要多此一举,倒序存储的链表,直接从头开始处理不是正好对应我们一般在草稿纸上加两个数时从个位开始加的过程么。

 LC已经为我们定义好了节点的抽象数据类型ListNode,就是一个类,包含两个属性,一个存储当前节点的值,一个存储下一个节点:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

.next如果不为空肯定也是ListNode类型,符合递归式的定义,而且题目要求返回值也为ListNode,自然想到用递归去实现。

大体思路是:从第一个节点开始,两个值相加,如果和大于10,立一个flag=True,同时将和减去10,否则为False,将和存入当前节点的val,然后递归解决下一节点。递归的出口是,两个节点都为空,且flag=False。

实际实现时,当有节点为空但还没到递归出口时,把空节点处理成ListNode(0),以便后续操作。

代码如下:

class Solution(object):        
    def addTwoNumbers(self, l1, l2, f = False):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if (l1 is None) and (l2 is None) and not f:    //递归出口
            return None
        node = ListNode(None)    //创建并临时存储当前节点,用于返回值
        flag = False
        if l1 is None:
            l1 = ListNode(0)    //未到出口时空节点的处理
        if l2 is None:
            l2 = ListNode(0)
        node.val = l1.val + l2.val + int(f)
        if node.val >= 10:    //模拟进位
            node.val -= 10
            flag = True
        node.next = self.addTwoNumbers(l1.next, l2.next, flag)    //    递归解决下一层
        return node

 

以上是关于LeetCode #2 - Add Two Numbers 递归实现的主要内容,如果未能解决你的问题,请参考以下文章

2. 两个数相加 [leetcode 2: Add Two Numbers]

2. 两个数相加 [leetcode 2: Add Two Numbers]

LeetCode - 2 - Add Two Numbers

[leetcode][2] Add Two Numbers

[LeetCode]2. Add Two Numbers

LeetCode - 2. Add Two Numbers