链表实现两个字符串的加法(反转链表)

来源:互联网 发布:网络进度计划软件 编辑:程序博客网 时间:2024/06/05 20:55

前不久面试时,被要求手写一下,用链表实现两个字符串的加法。
好久没写链表了,当时一紧张还写错了。于是来复习一下。
思路很简单,先把两个字符串转成链表,然后再对链表进行反转,
就可以从最低位开始加了,类似于大数加法的思路。

#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;}
原创粉丝点击