程序员面试金典: 9.2链表 2.5对两个用链表表示的整数求和
来源:互联网 发布:js分割字符串成数组 编辑:程序博客网 时间:2024/06/05 06:56
#include <iostream>#include <stdio.h>using namespace std;const int MAXSIZE = 1000;/*问题:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是 个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。分析:比如两个数分别是123,789,由于个位在首部,得到如下的两个数 3 2 1 9 8 7 2 1 9 最终结果为912,算的时候直接从左向右(从低位到高位算即可,读取的时候反向读取链表即可)输入:123 789123 89输出:912212关键:1 需要明白相加的两个整数长度可能不同,需要注意遍历*/typedef struct Node{int value;Node* pNext;}Node;//构建连边,按照尾插法来做,返回节点值到出现次数的映射void buildList(int* pArray , Node* head , int num){if(pArray == NULL){return;}if(head == NULL){return;}//尾插法: 保留最后一个结尾节点,将新生成的节点插入在结尾节点,并令结尾节点为当前节点Node* pLast = head;//int num = sizeof(pArray) / sizeof(int);for(int i = 0 ; i < num ; i++){int value = *(pArray + i);Node* pNode = new Node();pNode->value = value;pLast->pNext = pNode;pLast = pNode;}}//这里必须先打印链表末尾,再打印末尾前面,void printList(Node* pHead){if(NULL == pHead){return;}printList(pHead->pNext);cout << pHead->value;}void releaseList(Node* pHead){if(NULL == pHead){return;}Node* pNode = pHead->pNext;Node* pPrevious = pHead;while(pNode){Node* pDeleteNode = pNode;pPrevious->pNext = pNode->pNext;pNode = pNode->pNext;pPrevious = pPrevious->pNext;delete pDeleteNode;}//删除头结点delete pHead;}//将123除10取余,123 / 10 =12余3 , 12 / 10 = 1余2 , 1 / 10 = 0余1 ,依次得到个位,10位,百位//获取总共的位数int getDigitNum(int num){int temp = num;int count = 0;do{temp /= 10;count++;}while(temp != 0);return count;}void getDigitArr(int num,int* pArr){int temp = num;int count = 0;//这里先拿到个位的,个位需要放在链表前面do{int num = temp % 10;pArr[count] = num;temp /= 10;count++;}while(temp != 0);}//将两个链表求和,个位是在链表首位,所加结果放在第一个链表中并返回,需要放在较长的链表中(默认是第一个)Node* sum(Node* nNode,Node* mNode){if(nNode == NULL || mNode == NULL){return NULL;}Node* pNNode = nNode->pNext;Node* pMNode = mNode->pNext;int pass = 0; //设置进位//注意,这里只能有一个不为空即可,如果另一个数为空,则按0计算while(pNNode || pMNode){//所加结果需要进位if(pMNode == NULL){pNNode->value += 0 + pass;}else{pNNode->value += pMNode->value + pass;}if( pNNode->value > 10){pNNode->value -= 10;pass = 1;}else{pass = 0;}pNNode = pNNode->pNext;if(pMNode != NULL){pMNode = pMNode->pNext;}}return nNode;}int main(int argc, char* argv[]){int n,m;while(cin >> n >> m){int nDigitNum = getDigitNum(n);int mDigitNum = getDigitNum(m);int* nArr = new int[nDigitNum];int* mArr = new int[mDigitNum];getDigitArr(n, nArr);getDigitArr(m, mArr);//得到两个数组之后,下面需要存入到链表中Node* nNode = new Node();buildList(nArr , nNode , nDigitNum);Node* mNode = new Node();buildList(mArr , mNode , mDigitNum);Node* pResult;if(nDigitNum >= mDigitNum){pResult = sum(nNode, mNode);}else{pResult = sum(mNode, nNode);}//注意这里空节点需要排除printList(pResult->pNext);cout << endl;releaseList(nNode);//releaseList(nNode);releaseList(mNode);delete[] nArr;delete[] mArr;}system("pause");return 0;}
0 0
- 程序员面试金典: 9.2链表 2.5对两个用链表表示的整数求和
- 【Java】对两个用链表表示的整数求和
- 给定两个链表表示的整数,编写函数对这两个整数求和,并用链表形式返回结果。
- 程序员面试金典(6)两个链表逆向表示的整数求和
- 《CTCI》2.5 链表表示的整数求和
- 求两个用链表表示的整数的和
- 链式A+B有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListN
- leetcode——Add Two Numbers 两个链表表示的正整数对其求和(AC)
- 程序员面试金典: 9.5位操作5.1两个整数的位合并
- 9.2链表(五)——给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部
- 求两个用链表表示的数字和
- 用链表表示的两个数相加
- 程序员面试金典:词频统计、整数对查找
- 不使用加减乘除对两个整数求和
- 用链表表示 数字 ,求和 leetcode cc
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- 【忙啊忙】- 两个字符串的大整数求和
- 不用+、-、×、÷对两个整数求和
- 使用Spring Boot开发Web项目
- 养成这五个习惯,成为资深设计师(三)
- repo使用
- iOS深入了解ReactiveCocoa的使用(二)
- 移动开发之微信小程序——资料集合
- 程序员面试金典: 9.2链表 2.5对两个用链表表示的整数求和
- adb截图自建bat文件
- TI 开发软件 CCS 5 的安装
- HTML iframe 和 frameset 的区别
- CSS 悬停选择
- lintcode,装最多水的容器
- 初试cmake
- Android PopupWindow被输入法弹上去之后无法恢复原位解决
- mongoDB 查询命令