原文:http://blog.csdn.net/iloveyoujelly/article/details/38321735

大数相加在我之前的一篇博客里有一个使用数组实现的方案,使用单链表实现更灵活。

有两个由单链表表示的数。每个结点代表其中的一位数字。

数字的存储是逆序的, 也就是说个位位于链表的表头。
写一函数使这两个数相加并返回结果,结果也由链表表示。

eg.

Input:(3->9->6), (4->7->8->3)

Output:(7->6->5->4)

[html] view plaincopy
  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. typedef struct node
  5. {
  6. int data;
  7. node *next;
  8. }Node, *LinkList;
  9. //建立链表
  10. Node* createList(const int a[], int n)
  11. {
  12. Node *head, *endPtr;
  13. head = endPtr = NULL;
  14. for(int i=0;i<n;i++)
  15. {
  16. Node *temp = new Node; / /node = (struct Node *)malloc(sizeof(struct Node));
  17. temp->data = a[i];
  18. temp->next = NULL;
  19. if(i==0)
  20. {
  21. head = endPtr = temp;
  22. }
  23. else
  24. {
  25. endPtr->next = temp;
  26. endPtr = temp;
  27. }
  28. }
  29. return head;
  30. }
  31. /*从尾到头打印链表,要求不修改链表结构*/
  32. //使用栈适配器
  33. void PrintListReversing(LinkList pHead)
  34. {
  35. stack<Node*> nodes;
  36. Node* pNode = pHead;
  37. if(pNode==NULL)
  38. return;
  39. while(pNode!=NULL)   //将节点依次入栈
  40. {
  41. nodes.push(pNode);
  42. pNode = pNode->next;
  43. }
  44. while(!nodes.empty())   //出栈
  45. {
  46. pNode = nodes.top();   //读取栈顶元素
  47. cout<<pNode->data;
  48. nodes.pop();   //删除栈顶元素
  49. }
  50. }
  51. //大数相加
  52. Node *ListAdd(Node* L1, Node* L2)
  53. {
  54. if(L1==NULL)
  55. return L2;
  56. if(L2==NULL)
  57. return L1;
  58. Node *ptr1 = L1, *ptr2 = L2, *ResultPtr=NULL, *TmpPtr=NULL;
  59. int carry = 0;
  60. Node *p_node = new Node();
  61. p_node->data = (L1->data+L2->data)%10;
  62. p_node->next = NULL;
  63. carry = (L1->data+L2->data)/10;
  64. ResultPtr = TmpPtr = p_node;
  65. TmpPtr->next = NULL;
  66. L1 = L1->next;
  67. L2 = L2->next;
  68. while(L1 && L2)
  69. {
  70. Node *pNode = new Node();
  71. TmpPtr->next = pNode;
  72. int tmp = L1->data+L2->data+carry;
  73. carry = tmp/10;
  74. pNode->data = tmp%10;
  75. pNode->next = NULL;
  76. TmpPtr = TmpPtr->next;
  77. L1 = L1->next;
  78. L2 = L2->next;
  79. }
  80. while(L1)
  81. {
  82. Node *pNode = new Node();
  83. TmpPtr->next = pNode;
  84. int tmp = L1->data+carry;
  85. carry = tmp/10;
  86. pNode->data = tmp%10;
  87. pNode->next = NULL;
  88. TmpPtr = TmpPtr->next;
  89. L1 = L1->next;
  90. }
  91. while(L2)
  92. {
  93. Node *pNode = new Node();
  94. TmpPtr->next = pNode;
  95. int tmp = L2->data+carry;
  96. carry = tmp/10;
  97. pNode->data = tmp%10;
  98. pNode->next = NULL;
  99. TmpPtr = TmpPtr->next;
  100. L2 = L2->next;
  101. }
  102. if(carry)
  103. {
  104. Node *pNode = new Node();
  105. TmpPtr->next = pNode;
  106. pNode->data = carry;
  107. pNode->next = NULL;
  108. }
  109. return ResultPtr;
  110. }
  111. int main()
  112. {
  113. int a[] = {1,9,9};  //991
  114. int b[] = {9,8,5,6,6,2,8};   //8266589
  115. Node *L1 = createList(a,3), *L2 = createList(b,7), *L3 = NULL;
  116. L3 = ListAdd(L1,L2);
  117. PrintListReversing(L1);
  118. cout<<"+";
  119. PrintListReversing(L2);
  120. cout<<"=";
  121. PrintListReversing(L3);
  122. cout<<endl;
  123. return 1;
  124. }

链表系列之单链表——使用单链表实现大整数相加相关推荐

  1. 力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~

    题目链接:力扣 力扣刷题------>单链表系列 第一种解法:在原链表上进行操作,小红日烧脑版 /*** Definition for singly-linked list.* public c ...

  2. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  3. 【数据结构】链表OJ特别篇 —— 面试情景带你深度剖析 环形链表系列问题 复制带随机指针的链表

  4. 大整数相加链表实现(Add Two Numbers)

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if(null == l1){return l2;}if(null == l2){re ...

  5. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

  6. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  7. python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

    题目 实现一个函数,一个可以删除单链表中倒数第k个节点 难度 简单 分析 本题比较简单,实现方法多种多样,这里提供一种方法 首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个 ...

  8. c语言双链表排序交换节点_图解:单链表翻转的三种方式!

    当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转. 单链表反转,反转后的效果如下: 看起来很简单,只需要将单链表所有结点的 nex ...

  9. c语言单链表超市出库,c语言-单链表(二)

    继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...

最新文章

  1. zip压缩与解压缩示例
  2. 风控业务-模型稳定性评价指标PSI
  3. php if !=,php If else 用法
  4. SmartUpload 中文API帮助
  5. 黑大选修计算机模拟物理学,黑龙江大学学分制选课指南.doc
  6. 分析“关于Linux内核引入的accept_local参数的一个问题”
  7. 谁说中国没有 Linus?中国初代 IT 宗师封神榜
  8. tcp中的crc检验算法原理_CRC校验算法原理
  9. TOGAF 10 正式发布
  10. java程序员必备快捷键
  11. Docker 教程:如何将Helix QAC作为容器创建并运行 上
  12. 20140925百度校园招聘二面
  13. centos 使用iptables实现只允许中国IP访问服务器或者禁止访问
  14. 完整性校验用到常见的算法_文件完整性校验
  15. js简易版歌单播放,可切换下一首
  16. JAVA经典算法40题
  17. Diagnosing Intermittent Authentication Failures and User Lock-Outs in Oracle WebLogic
  18. 【排序】快排(霍尔快排)
  19. 安乐高机器人图纸_乐高机器人搭法,乐高机器人 8547 搭建图纸 PDF文件
  20. A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) UVA - 12412

热门文章

  1. P_C_Brules
  2. Selenium+python --获取百度联想词
  3. Codeforces 468C/469E 易错点
  4. iOS客户端开发流程
  5. Source Insight中的多行注释
  6. pe文件被装入内存时按64k对齐
  7. 「12306奇葩验证码」反例背后的产品观
  8. Nancy简单实战之NancyMusicStore(二):打造首页
  9. 招募技术合伙人(H5混合开发+秒开流应用)
  10. 联想50寸4K电视S9开箱:骚黄的大块头