思路:
就是链表的遍历
难点是进位
代码:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode pre=new ListNode(0);
ListNode cur=pre;
int carry=0;
while(l1!=null||l2!=null){
int x=l1==null?0:l1.val;
int y=l2==null?0:l2.val;
int sum=x+y+carry;
carry=sum/10;
sum=sum%10;
cur.next=new ListNode(sum);
cur=cur.next;
if(l1!=null){
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
if(carry==1){
cur.next=new ListNode(carry);
}
return pre.next;
}
}
分解:
1)设置2个指针,一个一直指向头,一个用于遍历
2)进位的设置:
carry是进位数,sum是余数,节点里存的就是sum的值
carry=sum/10;
sum=sum%10;
在最后,如果还有一个进位,就要把它单独新建一个节点
if(carry==1){
cur.next=new ListNode(carry);
}
复杂度分析:
时间复杂度:O(N)遍历l1和l2的所有元素
空间复杂度:O(1)新建的链表是必须的空间