每日LeeCode——2. 两数相加
难度中等5238收藏分享切换为英文接收动态反馈
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:
将两个链表看成是相同长度的链表进行从头到尾的遍历,根据加法的从低位开始算起,就是从链表的表头开始算起,取出两个链表中的低位进行 ”+“运算,考虑进位问题设置变量temp来代表进的位数则:
int sum = (l1.val+l2.val+temp)%10;
sum代表了当前位的值,而进位数temp则是:
temp = (l1.val+l2.val+temp)/10;
此时建立新结点node用来存储当前位的值并插入链表当中,循环进行上述步骤,当 l1 或者 l2 其中一个为空时,就用0来代替:
int a = l1!=null?l1.val:0;
int b = l2!=null?l2.val:0;
直到循环结束。在判断最后是否要进位。
代码1
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode pre = new ListNode(0); //创建头结点以便于操作
ListNode p = pre; //
int temp = 0;
while(l1 != null || l2 != null) {
int a = l1 == null ? 0 : l1.val;
int b = l2 == null ? 0 : l2.val;
int sum = a + b + temp;
temp = sum / 10;
sum = sum % 10;
p.next = new ListNode(sum);
p = p.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(temp == 1) { //判断最高位是否要进位
p.next = new ListNode(temp);
}
return pre.next;
}
代码2
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
return add(l1,l2,0);
}
public static ListNode add(ListNode la,ListNode lb,int temp){
if(la==null&&lb==null&&temp==0){
return null;
}
int a = la!=null?la.val:0;
int b = lb!=null?lb.val:0;
int c = a+b+temp;
ListNode LC = new ListNode(c%10);
LC.next = add(la!=null?la.next:null,lb!=null?lb.next:null,c/10);
return LC;
}
如有问题,还请指正。
参考:画解算法