又写了一个比较丑的递归的
#include <iostream>
using namespace std;
struct Node
{
int val;
Node *next;
struct Node(int _val = 0, Node* _next = NULL)
: val(_val), next(_next)
{
}
};
struct List
{
Node* head;
int length; /* 长度 */
List()
{
head = NULL;
length = 0;
}
};
// 返回值代表是否有进位,0代表没有进位,1代表有一位进位
// 最后一个参数newHead为加法后的链表头结点
void Add(Node* head1 , int len1, Node* head2, int len2, Node*& newHead, int& len)
{
if(len1 == 0 && len2 == 0)
return;
if(len1 < len2)
return Add(head2, len2, head1, len1, newHead, len);
Node* tmpNode = NULL;
if(len1 == len2)
{
Add(head1->next, len1 - 1, head2->next, len2 - 1, newHead, len);
if(len < len1)
{
int tmpVal = head1->val + head2->val;
for(int i = 0; i < 2; i++)
{
if(tmpVal == 0)
break;
tmpNode = new Node(tmpVal % 10, newHead);
newHead = tmpNode;
++len;
tmpVal /= 10;
}
}
else
{
int tmpVal = head1->val + head2->val + newHead->val;
newHead->val = tmpVal % 10;
tmpVal /= 10;
if(tmpVal > 0)
{
++len;
tmpNode = new Node(tmpVal, newHead);
newHead = tmpNode;
}
}
}
else
{
Add(head1->next, len1 - 1, head2, len2, newHead, len);
if(len < len1)
{
Node *tmpNode = new Node(head1->val, newHead);
newHead = tmpNode;
++len;
}
else
{
int tmpVal = newHead->val + head1->val;
newHead->val = tmpVal % 10;
tmpVal /= 10;
if(tmpVal > 0)
{
tmpNode = new Node(tmpVal % 10, newHead);
newHead = tmpNode;
++len;
}
}
}
}
void Add(const List& list1, const List& list2, List& list3)
{
Add(list1.head, list1.length, list2.head, list2.length, list3.head, list3.length);
}
int main()
{
List list1, list2;
Node* head1 = NULL, *head2 = NULL, *tmpNode = NULL;
for(int i = 0; i < 3; i++)
{
tmpNode = new Node(9, head1);
head1 = tmpNode;
}
list1.head = head1;
list1.length = 3;
for(int i = 0; i < 3; i++)
{
tmpNode = new Node(9, head2);
head2 = tmpNode;
}
tmpNode = new Node(1, head2);
head2 = tmpNode;
list2.head = head2;
list2.length = 4;
List list3;
Add(list1, list2, list3);
tmpNode = list3.head;
while(tmpNode != NULL)
{
cout <<tmpNode->val << " ";
tmpNode = tmpNode->next;
}
cout << endl;
// 资源释放就不写了
return 0;
}