算法学习-链表相加

来源:互联网 发布:软件项目实施进度计划 编辑:程序博客网 时间:2024/06/08 05:52

题目

给定两个链表,分别表示两个非负整数。他们的数字逆序存储在链表中,且每个节点只存储一个数字,计算两个数的和,并且返回和的链表头指针。

如:输入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来表示

这个题目可以扩展成为一个大整数加法运算和高精度小数运算。

0 0
原创粉丝点击