题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
/** x+y* 2 3 4 5 6 7 (x)* * + 4 7 2 5 (y)** = 2 3 9 2 9 2 **/
class Solution {//进行逻辑计算的节点public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//任何相加的节点不存在时,直接返回另外一个节点结果,例如x的万位为3,y没有万位,那么万位相加的结果直接得出是3if(l1==null){return l2;}if(l2==null){return l1;}//计算当前节点,比如x与y的个位相加 7+5,那么sum为12int sum =l1.val+l2.val;//计算余数,12%10=2,head为当前位保存的数也就是2。ListNode head = new ListNode(sum%10);//计算个位的下一位十位,十位进入递归方法,也就是x的十位6与y的十位2进行相加。递归方法返回的是head,也就是对应位保存的数,我们可知(6+2)%10=8。所以当前head.next=8。head.next=addTwoNumbers(l1.next, l2.next);//当前对应位相加结果sum是12>9,所以需要计算下一位的值8与进位1相加。也就是8与1相加=9if(sum>9){//所以得出下一位十位的实际值为9。head.next=addTwoNumbers(head.next, new ListNode(1));}//返回当前对应位节点。return head;}
}
可知,递归的意义就是在递归中,不断的向next也就是高位计算,在计算出个位结果后,需要计算十位的结果,并将十位的节点挂在当前节点之next,且需要判断是否进位,如果需要进位,那么需要将进位的1与next再进入递归进行相加。为什么需要再进入递归相加,而不是进行普通相加计算,因为如果下一位是9,那么进位的1又会与9相加并进位,因此进位的相加也需要进入递归。
我们还需要注意的一点,这里我们发现对应位(也就是个位与个位相加,十位与十位相加,百位与百位相加)的相加递归,和进位与下一位 相加的递归是两个递归方法,仔细思考这样是没问题的,我们心算的时候,甚至可以不管是否进位,可以先算对应位的相加,最后再计算进位相加。
* 2 3 4 5 6 7 (x)
*
* + 4 7 2 5 (y)
比如不管进位的情况下
相加计算的结果是 238282。
我们再来另外计算进位,可知十位需要进位1相加,千位需要进位1相加。
那么结果是239292。与正确结果相符。所以这里我们不要受到必须计算进位与下一位的结果,才计算下下一位的相加结果,因此进位的递归相加,和对应位的递归相加,可以是两个递归方法。