LeetCode2题:链表两数相加递归实现
思路:
递归,就是在一个方法了不断调用自己。
使用递归,明确三点:
1、递归终止的条件
2、找返回值
3、本级递归应该做什么
递归只关心本一级需要做什么,而不需要想下一步做什么,即使可能存在很多步,只需想明白一步,因为许多步都是这一步的重复
分析题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
每个节点数相加,得到的和为新节点的数。
拆分每一步,都只是两个链表的节点相加。那我们就只考虑一步
要注意到的是,两个链表节点的和如果加起来大于10,会产生进位。进位会影响下一步节点相加的结果。
首先搞清楚:
1、递归终止的条件
当两个链表都指向null并且节点相加后的进位为0
2、返回值
返回的是两个链表节点相加后产生的新节点
3、本级递归要做什么
本级递归要做的是:
主要:
将两个节点的值加起来得到一个和,新建一个节点,节点的值就是他们的和
次要:
判断和是否有进位
判断链表的值,因为两个链表长度并不一定相同,当一个链表为空时,对应的值就为空
代码实现:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
return addTwo(l1,l2,0);
}
public ListNode addTwo(ListNode l1,ListNode l2,int carry){
//递归终止条件 :当两个链表的指针都指向空并且进位为o时
if(l1 == null && l2 == null && carry == 0){
return null;
}
//本级递归做的事:
//获取链表的值
int value1 = l1 == null ? 0 : l1.val;//如果l1为空,value1的值为0,如果l1不为空,value1的值为l1.val
int value2 = l2 == null ? 0 : l2.val;//如果l2为空,value2的值为0,如果l2不为空,value1的值为l2.val
int curSum = value1 + value2 + carry;//得到两个节点相加后的值,carry代表进位
ListNode ans = new ListNode(curSum % 10); //新建一个节点,数据为curSum除10取余,因为如果sum大于10后,节点的数据其实是个位上的数
ans.next = addTwo( l1 == null ? null : l1.next, l2 == null ? null : l2.next , curSum /10); //根据判断l1或l2是否为空来确定他们的参数值
return ans; //返回值 :返回新建的节点
}