题目要求:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
示例
输入:(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;
}

博客围绕两个逆序链表表示非负整数相加问题展开。给出示例,如(2 -> 4 -> 3) + (5 -> 6 -> 4)结果为7 -> 0 -> 8 。介绍思路,用两个指针遍历链表,相加得sum,取余得当前数字、整除得进位数,进位数不为0时添加到链表,时间复杂度O(max(m,n)),空间复杂度O(1)。
114

被折叠的 条评论
为什么被折叠?



