2.两数相加-力扣(LeetCode)

LeetCode地址:https://leetcode-cn.com/problems/add-two-numbers/

目录

递归

栈概念图形

代码

递归

  • 递归函数的实现,是通过栈来完成的。在递归函数没有到达递归出口前,都要不停地执行递归体,每执行一次,就要在工作栈中分配一个工作记录的空间给该“层”调用存放相关数据,只有当到达递归出口时,即不再执行函数调用时,才从当前层返回,并释放栈中所占用的该“层”工作记录空间。

值得注意,递归调用时,每次保存在栈中的是局部数据,即只在当前层有效的数据,到达下一层时上一层的数据对本层数据没有任何影响,一切从当前调用时传过来的实在参数重新开始。 

栈执行流程

原题

       代码执行流程

代码

每一行都添加了注释,认真阅读注释并看栈执行流程抽象图就可以啦 (๑•̀ㅂ•́)و✧

public class 两数相加 {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return recursion(l1, l2, 0);
    }

    ListNode recursion(ListNode l1, ListNode l2, int i) { // i 表示向前进位例如:5+6=11 ,向前进位1,i= 1
        /**
         * && 表示逻辑与(and),当两边的表达式都为true时,整个运算结果才为true
         * 判断 i 的作用是:如果计算到最后一位的时候两数相加 >10 需要进位,如果等于0代表没有进位
         */
        if (null == l1 && null == l2 && i == 0) {
            return null;
        }
        /**
         * sum 用于累加两个链表的值
         * i 代表上一位计算的进位制,本题i只有两个值:1或0
         */
        int sum = (null != l1 ? l1.val : 0) + (null != l2 ? l2.val : 0) + i;
        /**
         * node 代表两个链表相加得到的新链表
         * sum%10 用于表示累加值进位后剩下的数例如:5+5=10,向前进位1,在当前位留下0,0就是sum%10得到的结果
         */
        ListNode node = new ListNode(sum % 10);
        /**
         * 递归
         * 取链表下一位作为递归条件:l1.next,l2.next,i
         */
        node.next = recursion(null != l1 ? l1.next : null, null != l2 ? l2.next : null, sum / 10);
        return node;
    }

    class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值