题目要求:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:l1长度为m,l2长度为n。时间复杂度O(max(m,n))。空间复杂度O(1)
【1】使用两个指针对两个链表进行遍历 ,若当前结点为空,则默认其值为0
【2】将2个数相加得到sum,sum%10得到当前数字,sum/10得到进位数
【3】注意当进位数最后不为0时,应将其添加至链表中
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p =l1,*q=l2;
ListNode* dummyHead=new ListNode(-1); //假的头节点
ListNode *s=dummyHead;
int carry=0,temp=0,a,b; //carry为进位数(最小为0,最大为1)。a,b为相加的两个数
while(p!=NULL||q!=NULL){
if(p!=NULL){
a=p->val;
p=p->next;
}else{
a=0;
}
if(q!=NULL){
b=q->val;
q=q->next;
}else{
b=0;
}
temp=(a+b+carry)%10; //当前结点数字
carry=(a+b+carry)/10; //计算新的进位数
ListNode* t=new ListNode(temp);
s->next=t;
s=s->next;
}
if(carry!=0){ //进位数不为0需进行添加,例(9->9)+(1)
ListNode *last=new ListNode(carry);
s->next=last;
}
return dummyHead->next;
}