leetcode1642链表求和(给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果)

给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。
示例:

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。

示例:

输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912

思路:

用递归解法,分别从两个链表的第一个节点开始,取一个值相加,相加的结果对10取模,取模得到值作为结果的一位节点。重复上述操作再从两个链表的下一位取值相加 ( 注 意 得 加 上 前 一 次 操 作 的 进 位 ) \color{red}{(注意得加上前一次操作的进位)} (),结果存入结点,通过递归将这些节点连接起来。
 

代码如下:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    
		//add为求和函数    
        ListNode res = add(l1, l2, 0);
        return res;
    }

	//head1和head2分别为两个链表的第一个元素,value为上一次操作的进位
    static ListNode add(ListNode head1,ListNode head2, int value) {
        if (head1 == null && head2 == null) {
            if (value == 1) {
            	//最后还有进位需要生成最后一个值为1的节点
                return new ListNode(1);
            } else {
            	//已完成最后一位的相加操作,开始逐层返回
                return null;
            }
        }
        if (head1 != null) {
        	//链表1要相加的那位不为空就把值加上
            value += head1.val;
        }
        if (head2 != null) {
        	//链表2要相加的那位不为空就把值加上
            value += head2.val;
        }
        //如果两个值相加后>=10就会产生进位,对10取模可得到减去进位的值
        ListNode res = new ListNode(value % 10);
        //如果两位相加的值小于10则没有进位,即进位为0
        //如果两位相加的值>=10,则要向高位进1
        //此处value值的意义变成了向高位的进位
        value = value < 10 ? 0 : 1;
        
        //此处的三目运算符功能是防止产生空指向异常,只有head1或者head2
        //不为空的情况才下才有next节点
        //传入的value值为向高位的进位
        res.next = add(head1==null?null:head1.next, head2==null?null:head2.next, value);
        return res;
    }
}
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值