两数相加
此博客链接:https://www.cnblogs.com/ping2yingshi/p/12736182.html
两数相加()
题目链接:https://leetcode-cn.com/problems/add-two-numbers/comments/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题解:
思路:
1.重新定义一个节点sum指向l1.
2.把l1和l2的数值相加,并加上一个count记录进位的。
3.加数对和取余得到各位数字。
4.加数对和除以10得到进位的数赋值给sum。
少考虑一种情况:
修改的程序:
思路:
1.新建一个链表。
2.定义一个节点cur指向新建的链表。
3.判断l1和l2是否为空,或者那个为空,要是那个为空,则只加进位和另外一个不为空的数字。
4.把求得的和放入新建的链表中。
5.判断最后还有进位吗?如果还存在进位,则把1加入新的链表中。
6.返回新建链表头节点的next.
注意:这里是把每次cur指向下一个节点创建一个新的节点并把求和结果放入节点中。
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode sum=new ListNode(0);//新建一个链表 ListNode cur=sum.next; int count=0; while(l1!=null||l2!=null) { if(l1!=null&&l2!=null) cur.val=(l1.val+l2.val+count); if(l1==null&&l2!=null) cur.val=(l2.val+count); if(l1!=null&&l2==null) cur.val=(l1.val+count); count=cur.val/10; cur.val=cur.val%10; cur=new ListNode(cur.val); cur=cur.next; l1=l1.next; l2=l2.next; } if(count==1) { cur.next=new ListNode(1); } return sum.next; } }
报错说明:
修改代码1:
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode sum=new ListNode(0);//新建一个链表 ListNode cur=sum; int count=0; int sumnum=0; while(l1!=null||l2!=null) { if(l1!=null&&l2!=null) sumnum=(l1.val+l2.val+count); if(l1==null&&l2!=null) sumnum=(l2.val+count); if(l1!=null&&l2==null) sumnum=(l1.val+count); count=sumnum/10; sumnum=sumnum%10; cur.next=new ListNode(sumnum); cur=cur.next; if(l1!=null) l1=l1.next; if(l2!=null) l2=l2.next; } if(count==1) { cur.next=new ListNode(1); } return sum.next; } }
修改代码2:这里是把每次求得的和放入新建的节点中,然后使cur的next指向这个新的节点
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode sum=new ListNode(0);//新建一个链表 ListNode cur=sum; int count=0; int sumnumble=0; while(l1!=null||l2!=null) { if(l1!=null&&l2!=null) sumnumble=(l1.val+l2.val+count); if(l1==null&&l2!=null) sumnumble=(l2.val+count); if(l1!=null&&l2==null) sumnumble=(l1.val+count); count=sumnumble/10; sumnumble=sumnumble%10; ListNode curnode=new ListNode(sumnumble); cur.next=curnode; cur=cur.next; if(l1!=null) l1=l1.next; if(l2!=null) l2=l2.next; } return sum.next; } }
这下可以在最后数字相加等于10时,新增加一个节点,但是并没有保存进位的数字。
添加如果最后一个数相加等于10时,进一位,并把进位加入到新建的链表中。
代码如下:
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode sum=new ListNode(0);//新建一个链表 ListNode cur=sum; int count=0; int sumnumble=0; while(l1!=null||l2!=null) { if(l1!=null&&l2!=null) sumnumble=(l1.val+l2.val+count); if(l1==null&&l2!=null) sumnumble=(l2.val+count); if(l1!=null&&l2==null) sumnumble=(l1.val+count); count=sumnumble/10; sumnumble=sumnumble%10; ListNode curnode=new ListNode(sumnumble); cur.next=curnode; cur=cur.next; if(l1!=null) l1=l1.next; if(l2!=null) l2=l2.next; } if(count==1) { ListNode curnode=new ListNode(1); cur.next=curnode; } return sum.next; } }