Leetcode 2_两数相加(c++实现)

 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

设计过程如下:
首先判断两个链表长度,如果长度不一致要进行补零
然后进行相加运算,要考虑进位情况;如果当前两位之和大于9,则进位flag等于1;下一位运算时要加上进位;
最后输出链表数据时首先要将链表进行逆序排序(采用reverse()函数),然后进行输出。

#include<iostream>
#include<list>
#include<iterator>
using namespace std;

class two_numplus
{
	public:
		bool input();//输入两个整数,分别按位存入链表
		bool make_up();//补齐
		bool sum();
		bool output();//输出结果
	private:
		int size1;
   		int size2;
    	list<int> target1;
		list<int> target2;
		list<int> result;
};

bool two_numplus::input()
{
	int temp=0 ;
    int temp1=0;
    int i,j;;
    cout<<"请输第一个整数位数:"<<endl;
    cin>>size1;
	cout<<"请按位输入第一个整数:"<<endl;
	for(i=0;i<size1;i++)
	{
		cin>>temp;
		target1.push_back(temp);
	}
	cout<<"请输入第二个整数位数:"<<endl;
    cin>>size2;
    cout<<"请按位输入第二个整数:"<<endl;
	for(j=0;j<size2;j++)
	{
		cin>>temp1;
		target2.push_back(temp1);
	}
	return true;
}

//补齐链表
bool two_numplus::make_up()
{
	int temp;
	if(target1.size()>target2.size())
	{
		temp=target1.size()-target2.size();
		for(int i=0;i<temp;i++)
		{
			target2.push_back(0);
		}
	}
	if(target1.size()<target2.size())
	{
		temp=target2.size()-target1.size();
		for(int i=0;i<temp;i++)
		{
			target1.push_back(0);
		}
	}

	//打印补齐之后的链表
	cout<<"补齐后的链表为:"<<endl;
	list<int>::iterator iter1=target1.begin();
	for(;iter1!=target1.end();iter1++)
	{
		cout<<*iter1<<" ";
	}
	cout<<endl;
	list<int>::iterator iter2=target2.begin();
	for(;iter2!=target2.end();iter2++)
	{
		cout<<*iter2<<" ";
	}
	cout<<endl;
	return true;
}

//求和
bool two_numplus::sum()
{	
	int temp;
	int carry=0;//表示进位
	list<int>::iterator iter1=target1.begin();
	list<int>::iterator iter2=target2.begin();
	for(;iter1!=target1.end();iter1++)
	{
		if(((*iter1)+(*iter2)+carry)>=10)
		{
			temp=(int)((*iter1)+(*iter2)+carry)%10;
			result.push_back(temp);
			carry=1;
		}	
		if(((*iter1)+(*iter2)+carry)<10)
		{
			temp=(*iter1)+(*iter2)+carry;
			result.push_back(temp);
			carry=0;
		}
    iter2++;
	}
	return true;
}

bool two_numplus::output()
{
	result.reverse();//链表反转
	cout<<"结果为:"<<endl;
	for(list<int>::iterator iter=result.begin();iter!=result.end();iter++)
	{
		cout<<*iter;
	}
	cout<<endl;
	return true;
}

int main()
{
	two_numplus aa;
	aa.input();
	aa.make_up();
	aa.sum();
	aa.output();
	return 0;
}

调试结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值