Leetcode-2 两数相加

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

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

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

示例:

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

通常方法(旨在解决问题):

#include <iostream>
#include <List>
#include <vector>

/***************************************************

考察的点:
1,考虑两个链表不对等怎么处理
2,处理最高位的进位
3, 在解决问题的基础上进行优化,待解决

****************************************************/

using namespace std;

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

class Solution {
public:
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
		int len1 = 1; // 记录l1长度
		int len2 = 1; // 记录l2长度

		ListNode* p = l1;
		ListNode* q = l2;

		while (p->next != NULL) //获取l1长度
		{ 
			len1++;
			p = p->next;
		}

		while (q->next != NULL)
		{
			len2++;
			q = q->next;
		}

		if (len1 > len2)
		{
			for (int i = 1; i <= len1 - len2; i++) {
				q->next = new ListNode(0); //游标节点指针指向新指针
				q = q->next; //游标节点指针移动一位
			}
		}
		else
		{
			for (int i = 1; i <= len2 - len1; i++)
			{
				p->next = new ListNode(0);
				p = p->next;
			}
		}

		p = l1;
		q = l2;

		bool count = false; //记录进位
		ListNode* head = new ListNode(-1); //存放和的链表
		ListNode* w = head; //l3的移动指针

		int carry = 0;

		int i = 0;
		while (p != NULL && q != NULL)
		{
			int x = (p != NULL) ? p->val : 0;
			int y = (q != NULL) ? q->val : 0;

			int sum = carry + x + y;

			carry = sum / 10; //获得carry

			w->next = new ListNode(sum % 10); //取余放进新链表中
			w = w->next; //游标w指针指向下一个

			if (p != NULL) p = p->next;
			if (q != NULL) q = q->next;
		}
		if (carry > 0) {
			w->next = new ListNode(carry);
			w = w->next;
			w->next = NULL;
		}
		return head->next;
	}
};


//创建list
ListNode* generatelistfromvector(vector<int> nums) {
	ListNode* head = new ListNode(-1);
	ListNode* current = head;

	for (int i = 0; i < nums.size(); i++)
	{
		current->next = new ListNode(nums[i]);
		current = current->next;
	}
	return head->next;
}

//显示list
void showlist(ListNode* head)
{
	ListNode* current = head;
	while (current != NULL) {
		cout << current->val << "," ;
		current = current->next;
	}
	cout << endl;
}

//释放list
void freelist(ListNode* head)
{
	ListNode* current = head;
	while (current != NULL) {
		auto temp = current->next;
		delete current;
		current = temp;
	}
}

//测试
int main()
{
	auto list1 = generatelistfromvector({1, 4, 6});
	auto list2 = generatelistfromvector({9, 5, 3, 5});

	showlist(list1);
	showlist(list2);

	Solution mytest;
	auto mytestresult = mytest.addTwoNumbers(list1, list2);
	showlist(mytestresult);

	freelist(list1);
	freelist(list2);
	freelist(mytestresult);

	system("pause");
	return 0;
}

 

根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值