Add Two Numbers 两数相加
问题描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
每个链表中的节点数在范围 [ 1 , 100 ] 内 0 < = N o d e . v a l < = 9 题目数据保证列表表示的数字不含前导 0 每个链表中的节点数在范围 [1, 100] 内\\ 0 <= Node.val <= 9\\ 题目数据保证列表表示的数字不含前导0 每个链表中的节点数在范围[1,100]内0<=Node.val<=9题目数据保证列表表示的数字不含前导0
分析
July 2的daily。比昨天的难度略高,这里的数值是以链表的形式给出。要求2个数进行相加。
以链表形式表达的数值,它的数值范围就可以不受 l o n g long long的限制了。因为最终的结果也是链表。
而对2个数进行相加,一定是从低位开始,这些都是小学数学。
需要注意的是进位,如果 s u m = x sum=x sum=x,那么留在当前位的数值就应该是 x m o d 10 x \mod 10 xmod10,而进位就交给 c a r r y = x / 10. carry = x/10. carry=x/10.
所以每次同一位置的数值相加,还要把carry计算进去。
因为链表整体是从低到高的,所以每计算出一个位置,就要把它插入到之前的链表结尾,至于如何操作链表,就不说了。
c
u
r
=
a
+
b
+
c
a
r
r
y
,
c
a
r
r
y
=
1
o
r
0
cur = a+b+carry, carry =1 or 0
cur=a+b+carry,carry=1or0
代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1,p2 = l2,h = new ListNode(),p = h;
int carry = 0,cur =0;
while(p1!=null||p2!=null){
cur =0;
cur += carry;
if(p1!=null){
cur += p1.val;
p1 = p1.next;
}
if(p2!=null){
cur += p2.val;
p2 = p2.next;
}
int v = cur%10;
carry = cur/10;
ListNode node = new ListNode(v);
p.next = node;
p = p.next;
}
if(carry>0){
p.next = new ListNode(1);
}
return h.next;
}
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1)
递归方法的也可以做
Tag
Math
LinkedList
文章来源:https://www.toymoban.com/news/detail-515043.html
Recursion
文章来源地址https://www.toymoban.com/news/detail-515043.html
到了这里,关于【算法】Add Two Numbers 两数相加的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!