LeetCode两数相加题递归Python解法标记行运行逻辑求解
核心代码行原理说明
标记的代码行内容如下:
x = node.val + 10 * toint(node.next) if node else 0
执行前提
首先明确LeetCode「两数相加」题目的链表规则:每个链表逆序存储一个整数的每一位,链表头节点存储整数的个位,第二个节点存储十位,以此类推。示例中2->4->3对应的整数就是342。
递归执行逻辑
递归函数的执行分为「向下调用」和「向上返回」两个阶段:先逐层调用到链表末尾的空节点,再从最内层开始逐层计算返回值。我们以示例中l1 = 2->4->3的toint(l1)调用为例,完整执行流程如下:
向下调用阶段(从链表头到尾)
- 第一层调用:
toint(节点2),node非空,需要先计算toint(node.next)即toint(节点4),当前层计算暂停 - 第二层调用:
toint(节点4),node非空,需要先计算toint(node.next)即toint(节点3),当前层计算暂停 - 第三层调用:
toint(节点3),node非空,需要先计算toint(node.next)即toint(None),当前层计算暂停 - 第四层调用:
toint(None),触发else分支,直接返回0
向上返回阶段(从链表尾到头)
- 第三层拿到内层返回的0,计算
x = 3 + 10 * 0 = 3,返回3给第二层 - 第二层拿到内层返回的3,计算
x = 4 + 10 * 3 = 34,返回34给第一层 - 第一层拿到内层返回的34,计算
x = 2 + 10 * 34 = 342,返回最终结果342
反转效果的实现逻辑
链表本身是低位在前、高位在后的逆序存储,递归先遍历到最后一个节点(对应整数的最高位),每向上返回一层,就把当前层的低位数字加到「高位部分数值*10」的结果上,刚好把逆序的链表节点拼接成了正常顺序的整数值,变相实现了链表的反转转整数。
你注释中提到的
print(a)输出2、4、3,是因为a在进入函数时就打印,顺序是从链表头到尾;print(x)的输出对应递归返回时的顺序,实际是3、34、342,注释属于简化表述。
内容的提问来源于stack exchange,提问作者Yankz Kuyateh
相关产品推荐
相关产品推荐

