
题目描述很清楚,最容易想到的就是从前往后一次相加即可。

题中所给的数据结构描述:
第一次的算法:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode(0);
ListNode cur=res;
int flag = 0;
while(l1!=null&&l2!=null)
{
cur.val=l1.val+l2.val+flag;
flag=cur.val/10;
cur.val=cur.val%10;
cur.next = new ListNode(0);
cur=cur.next;
l1=l1.next;
l2=l2.next;
}
while(l1!=null)
{
cur.val=l1.val+flag;
flag=cur.val/10;
cur.val=cur.val%10;
cur.next = new ListNode(0);
cur=cur.next;
l1=l1.next;
}
while(l2!=null){
cur.val=l2.val+flag;
flag=cur.val/10;
cur.val=cur.val%10;
cur.next = new ListNode(0);
cur=cur.next;
l2=l2.next;
}
return res ;
}
}
其中flag为保存是否进位,初始为0。
第一次运行的结果:

与结果多了一个0,原因在于当节点在最后一个时,也会生成新的节点,所以会多出一个0。同时上述代码还没有考虑到最后一位如果产生进位的情况。所以,我们需要一个新的节点保存最后一个节点的前一个节点。
修改后的代码:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode(0);
ListNode cur=res;
ListNode pre=null;
int flag = 0;
while(l1!=null&&l2!=null)
{
cur.val=l1.val+l2.val+flag;
flag=cur.val/10;
cur.val=cur.val%10;
cur.next = new ListNode(0);
pre=cur;
cur=cur.next;
l1=l1.next;
l2=l2.next;
}
while(l1!=null)
{
cur.val=l1.val+flag;
flag=cur.val/10;
cur.val=cur.val%10;
cur.next = new ListNode(0);
pre=cur;
cur=cur.next;
l1=l1.next;
}
while(l2!=null){
cur.val=l2.val+flag;
flag=cur.val/10;
cur.val=cur.val%10;
cur.next = new ListNode(0);
pre=cur;
cur=cur.next;
l2=l2.next;
}
if(flag==0)
{
pre.next=null;
}else
{
cur.val=flag;
}
return res ;
}
}
结果:
来源:https://www.cnblogs.com/stive-night/p/12292783.html