leetcode练习2(链表表示两数之和)

题目: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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++;
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值