1. 程式人生 > 實用技巧 >連結串列實現大整數相加

連結串列實現大整數相加

#include <bits/stdc++.h>
using namespace std;

typedef struct node
{
    int value;
    node *next;
}linklist;

linklist* ReverseList(linklist *head){
    linklist *next;
    linklist *pre = NULL;
    while (head != NULL) {
        next = head->next;
        head->next = pre;
        pre 
= head; head = next; } return pre; } linklist* ADD(linklist*L1, linklist*L2){ linklist *l1 = ReverseList(L1); linklist *l2 = ReverseList(L2); linklist *res = NULL, *p; int num = 0, sum; while(l1 || l2){ if(l1 && l2){ sum = l1->value + l2->value + num; l1
= l1->next; l2 = l2->next; } else if(l1){ sum = l1->value + num; l1 = l1->next; } else if(l2){ sum = l2->value + num; l2 = l2->next; } num = sum/10; sum = sum%10; linklist *tmp = new
linklist(); tmp->value = sum; if(res == NULL){ res = tmp; p = res; } else { p->next = tmp; p = p->next; } } res = ReverseList(res); return res; } linklist* CreateList(int Size){ int num; linklist *head = NULL, *p; while(Size--){ cin >> num; linklist *tmp = new linklist(); tmp->value = num; if(head == NULL){ head = tmp; p = head; }else { p->next = tmp; p = p->next; } } return head; } void PRINT(linklist *head){ linklist *p = head; if(p != NULL){ cout << p->value; p = p->next; } while(p != NULL){ cout << "->" << p->value ; p=p->next; } cout << endl; } int main(){ int n, m; cin >> n >> m; linklist *L1 = CreateList(n); //PRINT(L1); linklist *L2 = CreateList(m); //PRINT(L2); linklist *L3 = ADD(L1, L2); PRINT(L3); return 0; } /* 輸入: 5 3 3 1 4 6 7 2 3 3 輸出結果: 3->1->7->0->0 時間複雜度為O(max(n,m)),空間複雜度為O(max(n,m)); 若可以修改原連結串列結構,可將空間複雜度降為O(1); */