博客
关于我
leetcode练习2(链表表示两数之和)
阅读量:277 次
发布时间:2019-03-03

本文共 2678 字,大约阅读时间需要 8 分钟。

题目: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807

题解:模拟竖式加法运算,从最低为开始计算,若最高位上仍存在进位,在最高位前还要进1

#include "iostream"using namespace std;#include"unordered_map"typedef struct number{   	int num;	struct number* next;}number;typedef struct result{   	int res;	struct result* next;}result;number* input(int k[3]){   	number* head, * mid;	number* end;	head = new number;	end = head;	for (int i = 0;i < 3;i++)	{   		mid = new number;		mid->num = k[i];		end->next = mid;		end = mid;	}	end->next = NULL;	return head;}result* output(number *s1,number*s2){   	result* head, * mid;	result* end;	head = new result;	end = head;	int carry = 0;	while (s1->next!=NULL && s2->next!=NULL)	{   		s1 = s1->next;		s2 = s2->next;		mid = new result;		end->next = mid;		end = mid;		mid->res = (s1->num + s2->num+carry) % 10;   //提取个位		carry = (s1->num + s2->num+carry) / 10;      //存储进位					}	if (carry)  //判断最高位是否要继续进位	{   		mid = new result;		end->next = mid;		end = mid;		mid->res = 1;	}	end->next = NULL;	return head;}int main(){   	int a[3] = {   3,2,9 };	number* a1, * a2;	result* res;	a1 = input(a);	a2 = input(a);	res = output(a1, a2);	int j=0;	while (res->next!=NULL)	{      		res = res->next;		if (res->next == NULL)		{   			cout << res->res;			j++;			continue;		}				if(!(j==0&&res->res==0))		 {   			cout << res->res << "->";		}		j++;	}	}

题解:如果是按照顺序的方式存储(其实是我第一次看错题目了。。)创建链表number存储加数的每一位,存储完成后将两加数相加,然后再用链表result存储结果的每一位

typedef struct number{   	int num;	struct number* next;}number;typedef struct result{   	int res;	struct result* next;}result;number* input(int k[3]){   	number* head, * mid;	number* end;	head = new number;	end = head;	for (int i = 0;i < 3;i++)	{   		mid = new number;		mid->num = k[i];		end->next = mid;		end = mid;	}	end->next = NULL;	return head;}result* output(number *s1,number*s2){   	result* head, * mid;	result* end;	head = new result;	end = head;	int sum[4];	for (int i = 0;i < 3;i++)	{   		s1 = s1->next;		s2 = s2->next;		sum[i] = (s1->num + s2->num)*pow(10,2-i);	}	sum[3] = sum[0] + sum[1] + sum[2];	for (int i = 0;i < 4;i++)	{   		int k;		k = sum[3] / (pow(10, 3 - i));	    mid = new result;		mid->res = k%10;		end->next = mid;		end = mid;	}	end->next = NULL;	return head;}int main(){   	int a[3] = {    9,2,3 };	number* a1, * a2;	result* res;	a1 = input(a);	a2 = input(a);	res = output(a1, a2);	int j=0;	while (res->next != NULL)	{      		res = res->next;		if (res->next == NULL)		{   			cout << res->res;			j++;			continue;		}				if(!(j==0&&res->res==0))		 {   			cout << res->res << "->";		}		j++;	}	}

转载地址:http://mssl.baihongyu.com/

你可能感兴趣的文章
网易云首倡中台方法论,发布全链路中台技术方案
查看>>
传输层协议
查看>>
DHCP和DHCP中继
查看>>
黄毅然的JAVA学习(七)
查看>>
Spring5框架工具类
查看>>
OPC应用实例和故障排除培训
查看>>
什么是网络基础设施?
查看>>
如何加载dll文件计算UDS服务的秘钥
查看>>
IP代理给模拟器多开和虚拟机多开提供了哪些帮助?
查看>>
细数哪些网络用户需要换IP?
查看>>
“山东大学移动互联网开发技术教学网站建设”项目实训日志一
查看>>
codeforces1307D 1900分最短路
查看>>
codeforces803F 2100分容斥原理 + 莫比乌斯函数
查看>>
2020牛客暑期多校训练营(第七场) 待补题
查看>>
2020牛客暑期多校训练营(第九场)
查看>>
The 2016 ACM-ICPC Asia Dalian Regional Contest 部分题解
查看>>
8皇后问题 递归 函数调用是重点
查看>>
1541 +1 *2 ²
查看>>
老鼠走迷宫
查看>>
跳马 (和小老鼠走迷宫差不多)
查看>>