前不久面试时,被要求手写一下,用链表实现两个字符串的加法。
好久没写链表了,当时一紧张还写错了。于是来复习一下。
思路很简单,先把两个字符串转成链表,然后再对链表进行反转,
就可以从最低位开始加了,类似于大数加法的思路。
#include <iostream>
#include <cstdio>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode* l) : val(x), next(l) {}
};
ListNode* digitToList(string s){
ListNode* first = new ListNode(0);
ListNode* current = first;
for(int i=0;i<s.length();i++ ){
current->next = new ListNode(s[i]-'0');
current = current->next;
}
return first;
}
/*链表转置方法1,依次把链表的第2个结点,插入头结点和第一个结点之间*/
ListNode *reverseList1(ListNode* l){
if(l==NULL)return NULL;
ListNode *tmp=l->next;
ListNode *p=NULL;
while(tmp->next){
p=tmp->next;
tmp->next=p->next;
p->next=l->next;
l->next=p;
}
return l;
}
/*链表转置方法2,先创建一个链表,每次在头结点后插入一个新的结点*/
ListNode *reverseList2(ListNode* l){
if(l==NULL)return NULL;
ListNode* first = new ListNode(0);
ListNode* tmp = NULL;
while(l->next){
l=l->next;
tmp=first->next;
first->next=new ListNode(l->val);
first->next->next=tmp;
}
return first;
}
void travelList(ListNode *l){
while(l->next){
l=l->next;
printf("%d-",l->val);
}
printf("\n");
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2){
// code here
ListNode *reverseL1=reverseList2(l1);
ListNode *reverseL2=reverseList2(l2);
travelList(reverseL1);
ListNode* first = new ListNode(0);
ListNode* current = first;
int tmp=0;
while(reverseL1->next && reverseL2->next){
reverseL1=reverseL1->next;
reverseL2=reverseL2->next;
int num1=reverseL1->val;
int num2=reverseL2->val;
current->next = new ListNode((num1+num2+tmp)%10);
current = current->next;
tmp=(num1+num2+tmp)/10;
}
while(reverseL1->next){
reverseL1 = reverseL1->next;
int num1=reverseL1->val;
current->next = new ListNode((num1+tmp)%10);
current = current->next;
tmp=(num1+tmp)/10;
}
while(reverseL2->next){
reverseL2 = reverseL2->next;
int num2=reverseL2->val;
current->next = new ListNode((num2+tmp)%10);
tmp=(num2+tmp)/10;
}
ListNode *ansList=reverseList(first);
return ansList;
}
int main(){
string A, B;
cin>>A>>B;
ListNode *l1 = digitToList(A), *l2 = digitToList(B);
ListNode* res = addTwoNumbers(l1,l2);
while(res->next){
res = res->next;
cout<<res->val;
}
cout<<endl;
}