<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">题目翻译如下:</span>
有两个链表,每个链表代表一个反向的数字,链表的每个位置代表数字的一位,求两个数字的和,同样用链表反向表示。
比如:2->4->3代表342,5->6->4代表465,它们的和是807,用链表反向表示是7->0->8
题解:
思考:把数字反向表示的话,问题的解决变得相当简单,两个链表从前往后遍历,相同位置的相加,维护一个进位即可
C++语言解决如下:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *tmp1=l1,*tmp2=l2;
ListNode* head=new ListNode(0);
ListNode *tmp=head;
int jinwei=0;
//遍历相加
while(tmp1!=NULL&&tmp2!=NULL){
int cur=tmp1->val+tmp2->val+jinwei;
if(cur>=10){
jinwei=cur/10;
cur%=10;
}else{
jinwei=0;
}
tmp->next=new ListNode(cur);
tmp1=tmp1->next;
tmp2=tmp2->next;
tmp=tmp->next;
}
//继续遍历l1
while(tmp1!=NULL){
int cur=tmp1->val+jinwei;
if(cur>=10){
jinwei=cur/10;
cur%=10;
}else{
jinwei=0;
}
tmp->next=new ListNode(cur);
tmp1=tmp1->next;
tmp=tmp->next;
}
//继续遍历l2
while(tmp2!=NULL){
int cur=tmp2->val+jinwei;
if(cur>=10){
jinwei=cur/10;
cur%=10;
}else{
jinwei=0;
}
tmp->next=new ListNode(cur);
tmp2=tmp2->next;
tmp=tmp->next;
}
if(jinwei!=0){
tmp->next=new ListNode(jinwei);
}
tmp=head->next;
delete head;
return tmp;
}
数字如果是正向表示呢,该怎么办?
比如:3->4->2代表342,4->6->5代表465,它们的和是807,用链表表示是8->0->7
思考:一种解决方式可以是从前往后遍历,把每个位置的数字进行保存,然后再从后往前遍历,计算结果。
利用栈会方便很多,但是这样用到了高级数据结构,同时空间复杂度变为O(n)。但暂时也没想到更好的方法。
代码如下:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> num1,num2;
for(ListNode* tmp=l1;tmp!=NULL;tmp=tmp->next){
num1.push(tmp->val);
}
for(ListNode* tmp=l2;tmp!=NULL;tmp=tmp->next){
num2.push(tmp->val);
}
int jinwei=0;
ListNode *head=new ListNode(0),*tmp=head;
while(!num1.empty()&&!num2.empty()){
int cur=num1.top()+num2.top()+jinwei;
num1.pop();num2.pop();
if(cur>=10){
jinwei=cur/10;
cur%=10;
}else{
jinwei=0;
}
tmp->next=new ListNode(cur);
tmp=tmp->next;
}
while(!num1.empty()){
int cur=num1.top()+jinwei;
num1.pop();
if(cur>=10){
jinwei=cur/10;
cur%=10;
}else{
jinwei=0;
}
tmp->next=new ListNode(cur);
tmp=tmp->next;
}
while(!num2.empty()){
int cur=num2.top()+jinwei;
num2.pop();
if(cur>=10){
jinwei=cur/10;
cur%=10;
}else{
jinwei=0;
}
tmp->next=new ListNode(cur);
tmp=tmp->next;
}
if(jinwei!=0){
tmp->next=new ListNode(jinwei);
}
tmp=head->next;
delete head;
return tmp;
}