LeetCode HOT 100 —— 2.两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
在这里插入图片描述
在这里插入图片描述
提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

思路

模拟链表:因为都是逆序存储,是相同的存储方式,所以两个链表中同一位置的数字可以直接相加

同时遍历(顺序遍历即可,不需要逆序遍历)两个链表,逐位计算它们的和,并和当前位置的进位值相加;

两个链表对应位置的数字为n1n2,进位值为carry,则两数之和为 n1 + n2 + carry

对应两个链表当前位置的数字为 (n1 + n2 + carry)MOD 10
产生的新的进位值为 (n1 + n2 + carry)/ 10

如果两个链表长度不一样,则可以认为长度短的链表的后面有若干个0,如123+45=168,转化成链表为:3->2->1 + 5->4->0 = 8->6->1,即168

最后,如果链表遍历结束后,有carry > 0,还需要在答案链表的后面附加一个节点,值为carry(简单来说就是加一个1节点,因为carry的值也只会是1)

java代码如下:

class Solution{//按照正常顺序相加依次进位即可
	public ListNode addTwoNumbers(ListNode l1, ListNode l2){
		ListNode dummy = new ListNode(0);
    	ListNode cur = dummy;
		int carry = 0;
		while(l1 != null || l2 != null){
			int n1 = l1 != null ? l1.val : 0 ;//如果当前数字不为空,则把数字赋给n1,否则的话,补0
			int n2 = l2 != null ? l2.val : 0 ;
			int sum = n1 + n2 + carry;//对应位置上的数字和,后面计算的新的进位值在这里加上了
			carry = sum / 10;//计算新的进位值,并在下一轮循环中(即前面计算sum那里)加上
			cur.next = new ListNode(sum % 10);
			cur = cur.next;
      		if(l1 != null) l1 = l1.next;//如果l1不为空,则指针后移继续判断下一个节点
			if(l2 != null) l2 = l2.next;
		}
		//退出循环后,即已经算完了所有位的数字
		if(carry > 0){
			cur.next = new ListNode(carry);
		}
		return dummy.next;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HDU-五七小卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值