题目描述很清楚,最容易想到的就是从前往后一次相加即可。
题中所给的数据结构描述:
第一次的算法:
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