LeetCode02:两数之和

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

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807


思路:两个链表不为空时,同一位置对应相加,若和大于10,则标记flag=1,下一位需要进位+1,重置flag=0;循环一直到某个链表为空,再判断剩下链表的情况即可。
#pragma once


struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(nullptr) {}
};


/*

执行用时 : 68 ms, 在Add Two Numbers的C++提交中击败了3.43% 的用户
内存消耗 : 19.1 MB, 在Add Two Numbers的C++提交中击败了0.94% 的用户
*/
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
	ListNode *newHead = new ListNode(0);
	ListNode *ptr = newHead;
	int flag = 0;
	while (l1 != nullptr && l2 != nullptr)
	{
		ListNode* temp = new ListNode(0);
		ptr->next = temp;
		ptr = temp;
		int sum = l1->val + l2->val;
		if (flag == 1)
		{
			sum += 1;
			flag = 0;
		}
		if (sum >= 10)
		{
			sum = sum - 10;
			flag = 1;
		}
		ptr->val = sum;
		l1 = l1->next;
		l2 = l2->next;
	}
	if (flag == 1 && l1 == nullptr && l2 == nullptr)
	{
		ListNode *tail = new ListNode(1);
		ptr->next = tail;
	}
	if (l1 != nullptr)
	{
		ListNode* tempL1 = l1;
		while (flag)
		{
			int sum = l1->val + 1;
			if (sum < 10)
			{
				l1->val = sum;
				break;
			}
			l1->val = sum - 10;
			if (l1->next == nullptr)
			{
				ListNode* tail = new ListNode(1);
				l1->next = tail;
				break;
			}
			else
				l1 = l1->next;
		}
		ptr->next = tempL1;
	}

	if (l2 != nullptr)
	{
		ListNode *tempL2 = l2;
		while (flag)
		{
			int sum = l2->val + 1;
			if (sum < 10)
			{
				l2->val = sum;
				break;
			}
			l2->val = sum - 10;
			if (l2->next == nullptr)
			{
				ListNode* tail = new ListNode(1);
				l2->next = tail;
				break;
			}
			else
				l2 = l2->next;
		}
		ptr->next = tempL2;
	}
	return newHead->next;
}

  

猜你喜欢

转载自www.cnblogs.com/cyhezt/p/10504225.html
今日推荐