题目
此题为简单的数学加法计算和简单的链表操作的结合,很简单,直接附上代码给定两个链表,分别表示两个非负整数。他们的数字逆序存储在链表中,且每个节点只存储一个数字,计算两个数的和,并且返回和的链表头指针。
如:输入2->4->3、5->6->4,输出:7->0->8
#include "stdafx.h"
#include <stdlib.h>
typedef struct tagSNode
{
int value;
tagSNode* pNext;
tagSNode(int v): value(v), pNext(NULL){}
}SNode;
void Print(SNode* pHead)
{
if (!pHead)
{
return;
}
SNode* p = pHead->pNext;
while(p)
{
printf("%d", p->value);
p = p->pNext;
}
printf("\n");
}
SNode* Add(SNode* pHead1, SNode* pHead2)
{
SNode* pSum = new SNode(0);
SNode* pTail = pSum;
SNode* p1 = pHead1->pNext;
SNode* p2 = pHead2->pNext;
SNode* pCur;
int carry = 0;
int value;
while (p1 && p2)
{
value = p1->value + p2->value + carry;
carry = value / 10;
value %= 10;
pCur = new SNode(value);
pTail->pNext = pCur;
pTail = pCur;
p1 = p1->pNext;
p2 = p2->pNext;
}
// 处理较长的链
SNode* p = p1 ? p1 : p2;
while (p)
{
value = p->value + carry;
carry = value / 10;
value %= 10;
pCur = new SNode(value);
pTail->pNext = pCur;
pTail = pCur;
p = p->pNext;
}
// 处理最后可能有的进位
if (carry != 0)
{
pTail->pNext = new tagSNode(carry);
}
return pSum;
}
void Destory(SNode* &pHead)
{
if (!pHead)
{
return;
}
SNode* p = pHead->pNext;
while(p)
{
SNode* pTmp = p;
p = p->pNext;
delete pTmp;
}
delete pHead;
pHead = NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
SNode* pHead1 = new SNode(0);
int i;
for (i = 0; i < 6; i++)
{
SNode* p = new SNode(rand() % 10);
p->pNext = pHead1->pNext;
pHead1->pNext = p;
}
SNode* pHead2 = new SNode(0);
for(i = 0; i < 9; i++)
{
SNode* p = new SNode(rand() % 10);
p->pNext = pHead2->pNext;
pHead2->pNext = p;
}
Print(pHead1);
Print(pHead2);
SNode* pSum = Add(pHead1, pHead2);
Print(pSum);
Destory(pHead1);
Destory(pHead2);
Destory(pSum);
system("pause");
return 0;
}
注:这里进位不可能大于1所以仅为可以用bool来表示
这个题目可以扩展成为一个大整数加法运算和高精度小数运算。