例如:9>9>9>NULL + 1>NULL => 1>0>0>0>NULL
肯定是使用递归啦,不然没办法解决进位+1问题,
此外对于999+1=1000,新得到的值的位数(4位)
//链表整数的加法实现
struct Node{
char data;
Node* next;
};
Node* add(Node* a, Node* b);
int _add(Node* a, Node* b, Node* &newhead, int M, int N);
//如果整数较大,就用反转链表来实现,如果整数较小,可以考虑递归
//递归代码较简洁
Node* add(Node* a, Node* b){
//递归两个链表知道长度
Node* p;
int len_a, len_b;
p = a; len_a = 0;
while( p != NULL ){ len_a++; p = p->next; }
p = b; len_b = 0;
while( p != NULL ){ len_b++; p = p->next; }
int temp;
if( len_a < len_b ){
p = a; a = b; b = p;
temp = len_a; len_a = len_b; len_b = temp;
}
//用于存储最高位是否产生进位
Node* newhead = new Node();
if( _add(a, b, newhead->next, len_a, len_b) == 1 ){
newhead->data = 1 + '0';
}
else{
//如果最高位没有进位,要删除最高位节点,防止内存泄露
Node *delNode = newhead;
newhead = newhead->next;
delete delNode;
}
return newhead;
}
//默认M大于N
//在递归调用该函数过程中,一定要将newhead的类型设为引用类型,需要返回下一层new的地址
int _add(Node* a, Node* b, Node* &newhead, int M, int N){
if( a == NULL ) return 0;
int temp = 0;
int result = 0;
newhead = new Node();
if( M > N ){
//存储低位产生的结果
result = _add(a->next, b, newhead->next, M-1, N);
temp = (a->data-'0') + result;
newhead->data = temp % 10 + '0';
return temp >= 10 ? 1 : 0;
}
// M==N时候
else{
result = _add(a->next, b->next, newhead->next, M-1, N-1);
temp = (a->data - '0') + (b->data - '0') + result;
newhead->data = temp % 10 + '0';
return temp >= 10 ? 1 : 0;
}
}