提交记录
执行结果:
解题思路:
链表题目一定要画图理解。该题实际就是加法的运算,只不过是数字的排列逆序罢了。还需要额外考虑需要进位的情况。以及两个加数位数不一致的情况。
语言:C++
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//虚拟头结点
ListNode*res=new ListNode(0);
ListNode*cur=res;
//定义进位
int fir;
int sec=0;
//l1不为空,或l2不为空,或l1、l2都不为空
while(l1!=NULL || l2!=NULL){
int x=(l1== NULL)? 0:l1->val;
int y=(l2== NULL)? 0:l2->val;
int sum=x+y+sec;
fir=sum%10;
sec=sum/10;
cur->next=new ListNode(fir);
cur=cur->next;
if(l1 !=NULL)l1=l1->next;
if(l2 !=NULL)l2=l2->next;
}
if(sec==1){
cur->next=new ListNode(1);
}
return res->next;
}
};
细节提升
1.链表题目一定要画图理解
这道题很巧妙,理解链表问题背后的应用方式可以开阔解题思路。
2.新链表
//申请新链表
ListNode*res=new ListNode(0);
ListNode*cur=res;
//新链表增加结点
cur->next=new ListNode(fir);
cur=cur->next;
3.链表长短不一致
//l1不为空,或l2不为空,或l1、l2都不为空
while(l1!=NULL || l2!=NULL){
int x=(l1== NULL)? 0:l1->val;
int y=(l2== NULL)? 0:l2->val;
if(l1 !=NULL)l1=l1->next;
if(l2 !=NULL)l2=l2->next;
}
4.结合应用背景
最后一位进位仅可能是进1。
if(sec==1){
cur->next=new ListNode(1);
}
5.避免重复计算
//反面教材
//括号里的和计算两次,增加了执行时间,实属冗余
fir=(q->next->val+p->next->val+sec)%10;
sec=(q->next->val+p->next->val+sec)/10;
//正面教材
sum=q->next->val+p->next->val+sec;
fir=(sum)%10;
sec=(sum)/10;