两数相加

LeetCode之两数相加:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers

根据题目我们可以分析其用到数据结构的链表其他的具体的知识点就暂时想不起来了主要是一系列的逻辑的判断。其中主要的为三个选择判断分别是当l1和l2都不为空时,l1为空l2不为空,l2为空l1不为空,在这三种情况下分别进行分析,其中还要考虑到进位的情况。(注意由于这是程序的一个函数且不是主函数,因此返回值要不可以使用在当前函数定义的局部变量。)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
   if (l1 == nullptr&&l2 == nullptr)
	{
		return nullptr;
	}
	/*使用两个新的指针便于在最后返回时使用l1或者l2的头结点*/
	ListNode *temp1 = l1;
	ListNode *temp2 = l2;
	int temp = 0;//定义一个零时变量用来判断是否进位
	ListNode *listNode = new ListNode(0);
	ListNode *templist = listNode;
	while (temp1 || temp2)
	{

		if (temp1&&temp2)//当temp1和temp2都不为空
		{
			if ((temp1->val + temp2->val + temp) < 10)
			{
				ListNode *newNode = new ListNode(temp1->val + temp2->val + temp);//使用构造函数赋值效率较高。
				temp = 0;
				temp1 = temp1->next;
				temp2 = temp2->next;
				listNode->next = newNode;
				listNode = listNode->next;
			}
			else
			{
				ListNode *newNode = new ListNode(temp1->val + temp2->val - 10 + temp);
				temp = 1;//如果其值大于10将temp标记为1便于进位。
				temp1 = temp1->next;
				temp2 = temp2->next;
				listNode->next = newNode;
				listNode = listNode->next;
			}
		}

		if ((temp1==nullptr)&&(temp2!=nullptr))//当temp1为nullptr但是temp2还不为nullptr时
	   {
		if (( temp2->val+temp) < 10)
		{
		ListNode *newNode = new ListNode( temp2->val + temp);
		temp = 0;
		temp2 = temp2->next;
		listNode->next = newNode;
		listNode = listNode->next;
		}
		else
		{
		ListNode *newNode = new ListNode(temp2->val - 10 + temp);
		temp = 1;
		temp2 = temp2->next;
		listNode->next = newNode;
		listNode = listNode->next;
		}

		}
		if ((temp1 != nullptr) && (temp2 == nullptr))//当temp2为nullptr但是temp1还不为nullptr时
		{
		if ((temp1->val+temp) < 10)
		{
		ListNode *newNode = new ListNode(temp1->val + temp);
		temp = 0;
		temp1 = temp1->next;
		listNode->next = newNode;
		listNode = listNode->next;
		}
		else
		{
		ListNode *newNode = new ListNode(temp1->val  - 10 + temp);
		temp = 1;
		temp1 = temp1->next;
		listNode->next = newNode;
		listNode = listNode->next;
		}

		}

	}
	
	if (temp != 0)//最后进行判断链表中的最后一项是否还存在着进位的状态如果存在则在进行下面的
	{
		ListNode *newNode = new ListNode(temp);
		listNode->next = newNode;
		listNode = listNode->next;
	}
	return templist->next;//因为第一项用来默认初始化了所以从第一项的next开始返回
}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值