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

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

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值