链表相加
2016-07-20 20:36
176 查看
给定两个链表,分别表示两个非负整数。他们的数字逆序存储在链表中,且每个节点只存储一个数字,计算两个数的和,并且返回和的链表头指正。
如:输入1->2>3 8->7->7 输出:0->0->0->1
解法:因为两个数都是逆序存储,正好可以从头向后依次想加,完成加法运算。注意考虑尾数不同的情况。
扩展:可以实现大整数运算!
如:输入1->2>3 8->7->7 输出:0->0->0->1
解法:因为两个数都是逆序存储,正好可以从头向后依次想加,完成加法运算。注意考虑尾数不同的情况。
扩展:可以实现大整数运算!
#include<cstdio> #include<iostream> #include<string> #include<malloc.h> using namespace std; struct node { int val; node *next; node(int v):val(v),next(NULL){} }; int n,m; void print(node *hea) { node *p=hea->next; int f=0; while(p) { if(f) printf(" "); printf("%d",p->val); f=1; p=p->next; } } void adds(node *hea1,node *hea2) { node *p=hea1,*q=hea2,*tail,*tmp; tail=new node(0); int car=0,s; if(n>m) { q=hea1; p=hea2; } while(p&&q) { s=p->val+q->val+car; car=s/10; s=s%10; q->val=s; tmp=new node(s); tail->next=tmp;//尾插法 tail=tmp; p=p->next; q=q->next; } while(q) { s=q->val+car; car=s/10; s%=10; q->val=s; q=q->next; } if(n>m) print(hea1); else print(hea2); if(car) printf(" 1\n");//把最后的进位加上 else printf("\n"); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { node *hea1,*hea2,*p; int num; hea1=new node(0); hea2=new node(0); for(int i=0;i<n;i++) { scanf("%d",&num); p=new node(num); p->next=hea1->next; hea1->next=p; } for(i=0;i<m;i++) { scanf("%d",&num); p=new node(num); p->next=hea2->next;//头插法 hea2->next=p; } adds(hea1,hea2); } return 0; }
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解
- js链表操作(实例讲解)