LeetCode 2 两数之和

博客围绕两个逆序存储数字的非空链表相加问题展开。先描述问题,即两链表各节点存一位数字,相加后返回新链表表示和。接着给出解决方案,创建带头结点单链表,逐位相加取余存新节点并保留进位,还需处理链表长度不同及最后进位情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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

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

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

示例:

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

解决方案:

依据题目描述,创建两个带头结点的单链表,逐个取出其中的数进行相加,相加后的数值取余数作为新的链表的一个节点值,并保留进位。需要注意的是两个链表长度不一样的情况,以及处理最后两个数相加可能产生的进位。

完整程序用例:

#include <iostream>
#include<string>
using namespace std;
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) {
		val = x;
		next = nullptr;
	}
};
ListNode* createList();
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);
int main() {
	ListNode* L1 = createList();
	ListNode* L2 = createList();
	ListNode* L3 = addTwoNumbers(L1->next, L2->next);
	for (L3; L3 != nullptr; L3 = L3->next) {
		cout << L3->val;
		if(L3->next!=nullptr)
			cout<< " -> ";
	}
	
	
	return 0;
}
ListNode* createList() {
	ListNode* dummyHead = new ListNode(0);
	dummyHead->next = nullptr;
	ListNode* r = nullptr;
	r = dummyHead;
	cout << "input the node number" << endl;
	int count;
	cin >> count;
	for (int i = 0; i < count; i++) {
		ListNode* s = new ListNode(0);
		cin >> s->val;
		r->next = s;
		r = s;
	}
	r->next = nullptr;
	return dummyHead;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	ListNode* dummyHead = new ListNode(0);
	dummyHead->next = nullptr;
	ListNode* p1 = l1, *p2 = l2,*curr = dummyHead;
	int carry = 0;
	while (p1!=nullptr||p2!=nullptr)
	{
		int x = (p1 != nullptr) ? p1->val : 0;
		int y = (p2 != nullptr) ? p2->val : 0;
		int sum = x + y + carry;
                carry=sum/10;		
		curr->next = new ListNode(sum % 10);
		curr = curr->next;
		if (p1 != nullptr)
			p1 = p1->next;
		if (p2 != nullptr)
			p2 = p2->next;

	}
	if (carry > 0) {
		curr->next = new ListNode(carry);
	}
	return dummyHead->next;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值