示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807
题目提示我们是两个非空的链表,因此我们可以选用链表结点的方法解决此题。我们先来说说此题的思路以及要考虑的因素:
思路:首先要创建一个空链表用来存放结果。两个逆序存储的链表,因此其链表头部指针所指依次为其表示数字的个位、百位、千位,依次类推。而在我们数学意义上的两个非负整数的相加正是从个位、百位,从低位开始相加,低位满十则向高位进一,对应到两个数据链表中由一个指针从表头开始,将两个数据链表对应位置的val相加,得到的结果即为对应结果链表结点的val。在此过程中我们要注意以下几个问题:
①若对应val相加得到的sum结果大于十,此时我们要将sum做%处理来存储到新链表中。除此之外,向前进位操作我们通过sum/10来实现,参与到下一位置的计算中,代码片段如下:其中carry表示向下一位置进位的值。
ListNode root=new ListNode();
ListNode cursor=root;
int carry=0;
while (l1!=null && l2!=null){
int sum=l1.val+l2.val+carry;
cursor.next=new ListNode(sum%10);
carry=sum/10;
l1=l1.next;
l2=l2.next;
cursor=cursor.next;
②当进行到两个链表中较短链表中最后一位时(这里假定两个链表不等长,实际上等长是一个道理),我们可以引入结点overplus代表较长的一个链表来继续进行将剩余元素赋予到结果链表:
ListNode overplus=null;
overplus=l1!=null?l1:l2;
while (overplus!=null){
int sum=overplus.val+carry;
cursor.next=new ListNode(sum%10);
carry=sum/10;
overplus=overplus.next;
cursor=cursor.next;
}
③当进行到较长链表的最后一位时,我们还要考虑最后一位的进位问题,即判断进位carry是否为0,不为0则继续进位:
if(carry!=0){
cursor.next=new ListNode(carry);
}
以下是完整代码:
public ListNode addTwoNumbers(ListNode l1, ListNode l2){
ListNode root=new ListNode();
ListNode cursor=root;
int carry=0;
while (l1!=null && l2!=null){
int sum=l1.val+l2.val+carry;
cursor.next=new ListNode(sum%10);
carry=sum/10;
l1=l1.next;
l2=l2.next;
cursor=cursor.next;
}
ListNode overplus=null;
overplus=l1!=null?l1:l2;
while (overplus!=null){
int sum=overplus.val+carry;
cursor.next=new ListNode(sum%10);
carry=sum/10;
overplus=overplus.next;
cursor=cursor.next;
}
if(carry!=0){
cursor.next=new ListNode(carry);
}
return root.next;
}
提交结果: