Bootstrap

递归算法实现链表两数相加

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; //返回值 :返回新建的节点
        }
;