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;
}
}
}