题目如下所示:
链表定义如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
看到这道题时很容易想到 对应位数相加再进位,主要是处理几个细节:
1.计算到最大位才终止
2.位数不够的可以看成前面补0
3.由于初始化链的值为0,要计算到那一位时才创建那一位的链,不然输出结果会多出个0,如1+18=019
4.要处理加上进位后大于10的值
5.最后一位加上进位值后大于10时,再加一位,如99+1=100
6.最后答案返回的是首部,需要有一直指向首部的
7.由于是单向链表,在后面修改next继续添加时,需要有指向前面的
结果如下:、
public class Solution {
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
int addN=0,num;
ListNode ans=new ListNode();
ListNode ansN=ans,ansP=ansN; //ans为答案,ansN为当前计算的,ansP为前一个
while(l1!=null||l2!=null){
if(ansN==null){ // 如果当前计算的链为空,则创建,并把前一个的next指向当前计算的
ansN=new ListNode();
ansP.next=ansN;
}
if (l1==null){ //对应位计算,位数不够的看成往前填0,如6+18看成06+18
num=0+l2.val;
l2=l2.next;
}
else if(l2==null){
num=0+l1.val;
l1=l1.next;
}
else {
num=l1.val+l2.val;
l1=l1.next;
l2=l2.next;
}
ansN.val=num+addN;//注意先加上一位给的进位,再改变给下一位的进位
if(ansN.val>9){ //大于10则进位1,由于最大为19,看成与10差值即可
ansN.val=ansN.val-10;
addN=1;
}
else addN=0;
ansP=ansN; //ansP与ansN都下一位
ansN=ansN.next;
}
if (addN==1){ //加到最后一位时若任有进位,记得在添加一位
ansN=new ListNode();
ansN.val=addN;
ansP.next=ansN;
}
return ans;
}
}
还考虑过迭代,但是给出的函数参数只有两个链表,不好处理进位问题,就没用