LeetCode题库第二题,两数相加(C++)

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

实例1;

2->4->3;      5->6->4;

输出:

7->0->8;

当程序输入示例1时,实际上输出为243+465=708;之后再将得到的结果按低位到高位逆序创造一个链表并输出。

解题思想1:

将输入的两个链表重新组合成整型的整数,再将两个整数直接相加得到一个新的整数。再将这个整数重新分出低位和高位放进新创建的链表里。

这个算法思想可以通过大多数的例子,但是有些例子随着链表长度的增长,将链表对应的整数输出将超过整型变量的输出范围,甚至超过了长整型变量允许的范围。导致该算法只能适用于链表不是很长的情况。

为解决这一问题,我们提出了新的解题思想:

解题思想2:

在解题思想2中,我们不再去将链表中的数据转化为整型储存到变量当中,直接在链表中进行对应位的相加,这样就避免了整型变量范围不够大的问题。

因为在实际的整数相加中,我们也是从低位到高位进行相加,例如342+123,我们首先考虑的就是两个整数的个位2与3的相加。相加得5,所以在返回的链表中的第一位就存储的是5。

由上例所示,我们整体的算法思想就是按每一位分别相加。这里就出现了在加法中我们需要考虑到的进位的问题。比如在107+207的情况下,个位的相加为7+7=14,于是我们在新的链表的对应位个位储存的数据就应为4,这个在算法中可以通过取余的运算来实现。进位的问题就需要我们额外的设计一个变量,用来储存是否有进位的产生。于是在上例中,我们个位的相加是7+7=14,于是在新的链表中的第一位就为4,而在这个例子中,产生了进位,所以存储进位的变量就设置为1,这样在次高位的加法中就变成了0+0+1=1;

最后一个需要考虑的问题就是在最高位的加法中出现进位。如99+5,这里在最高位会出现9+1=10的情况,这个时候我们在链表的最后就应该将10分成0和1进行输出。

至此完成该题的解题思想解答。

解法思想1代码如下:

class Solution {
public:

	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

		int i = 1;
		int num1=0, num2=0;
		while (l1 != nullptr) {
			num1 = (l1->val) * i+num1;
			i = i * 10;
			l1 = l1->next;
		}									//将链表1中的数据转成整型
		i = 1;
		while (l2 != nullptr) {
			num2 = (l2->val) * i+num2;
			i = i * 10;
			l2 = l2->next;
		}									//将链表2中的数据转成整型

		num1 = num1 + num2;					//将两个数据相加


		ListNode* l3=nullptr;
		l3 = new ListNode;
		l3->val = num1 % 10;
		l3->next = nullptr;
		num1 = num1 / 10;
		ListNode* head = l3;
		ListNode* temp = nullptr;
		while (num1 != 0) {
			temp = new ListNode;
			temp->val = num1 % 10;
			temp->next = nullptr;
			head->next = temp;
			head = head->next;
			num1 = num1 / 10;

		}
		
		return (l3);
	}
};	

解法思想2代码如下:

class Solution {
public:

	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

		int judge = 0;
		int num1 = 0; int num2 = 0;
	


		ListNode* l3=nullptr;
		l3 = new ListNode;
		l3->val =(l1->val+l2->val)%10;
		l3->next = nullptr;
		if (l1->val + l2->val >= 10)
			judge = 1;
		ListNode* head = l3;
		ListNode* temp = nullptr;
		l1 = l1->next;
		l2 = l2->next;
		while (l1!= nullptr || l2!=nullptr) {
			temp = new ListNode;
			if (l1 == nullptr) {
				num1 = 0;
			}
			else {
				num1 = l1->val;
			}
			if (l2 == nullptr) {
				num2 = 0;
			}
			else {
				num2 = l2->val;
			}
			temp->val = ((num1 + num2) + judge)%10;
			if (num1+num2 +judge>= 10) {
				judge = 1;
			}
			else
			{
				judge = 0;
			}
			
			temp->next = nullptr;
			head->next = temp;
			head = head->next;
			if(l1!=nullptr)
			l1 = l1->next;
			if(l2!=nullptr)
			l2 = l2->next;
		}
		if (judge == 1) {
			temp = new ListNode;
			temp-> val= 1;
			temp->next = nullptr;
			head->next = temp;
			head = head->next;
		}
		return (l3);
	}
};

最终提交结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值