【3分钟秒懂算法题解】 LeetCode 2. 两数相加

2. 两数相加

原题链接
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

要点

两个链表对应相同位置相加,如果超过10那么需要将个位数保留,十位数往下记录。
特别指出在链表

解法

两数相加
创建一个Result结果链表,过程如下:

  1. 3+3 = 6
  2. 5+5 = 10,个位保留0,十位1向下传递
  3. 5+5+1= 11,个位保留1,十位1向下传递
  4. 0+0+1= 1
代码片段
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	if (l1 == null) {//1. 如果l1 或者 l2为空,返回另一个就行了。
		return l2;
	} else if (l2 == null) {
		return l1;
	}
	ListNode listNode = new ListNode(0);//2.创建一个用来保存结果的链表,第一个节点没有实际用途。
	ListNode cur = listNode;//4.创建一个指针来更新当前写入的位置,不能直接用listNode,否则结果就只剩最后一个节点。
	var nextV = 0;//5.两数相加,有可能大于等于10,此时要记录十位的信息到下一个位置。
	while (l1 != null || l2 != null) {//6.只要其中一个链表还有数字就可以继续做加法。
		int l1V = 0;
		int l2V = 0;
		if (l1 != null) {//7. 如果当前结点不为空,更新其中一个加数,并指向下一个位置。
			l1V = l1.val;
			l1 = l1.next;
		}
		if (l2 != null) {
			l2V = l2.val;
			l2 = l2.next;
		}
		int val = l1V + l2V + nextV;//8.将所有的值相加。
		int v = val % 10;//9.保留个位数
		nextV = val / 10;//10.更新十位数
		cur.next = new ListNode(v);//11.创建一个相加之后的节点信息
		cur = cur.next;//12.指向下一个创建节点的位置。
	}
	if (nextV > 0) {//13.特殊情况,如果两个链表都遍历完毕了,如果十位还是数字应该创建一个节点。
		cur.next = new ListNode(nextV);
	}
	return listNode.next;//3.返回结果链表的下一个节点,放弃初始化的第一个节点。
}

结尾

1.博客地址
2.源代码仓库

如果你在代码里看到了用 数字标记的注释 如 //1.xxx 这是我写代码的顺序,希望能给你一点启发。


😁😁😁制作动画过程不易,请大家顺手点赞收藏咯 谢谢~😁😁😁
有其它题目不理解的也可以一起学习,如有错误欢迎指出~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值