445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

示例1:

输入:l1 = 7,2,4,3, l2 = 5,6,4
输出:7,8,0,7

示例2:
输入:l1 = 2,4,3, l2 = 5,6,4
输出:8,0,7

示例3:
输入:l1 = 0, l2 = 0
输出:0

提示:

  • 链表的长度范围为 1, 100
  • 0 <= node.val <= 9
  • 输入数据保证链表代表的数字无前导 0

进阶:如果输入链表不能翻转该如何解决?

法1:

  1. 头插法对整个链表原地逆转,
  2. 之后对链表依次相加取余
  3. 结果使用头插法的形式插入
cpp 复制代码
//原地逆转
void reverseListNode(ListNode*& l1) {
	ListNode *res = nullptr;
	ListNode *cur = nullptr;
	ListNode *nextNode = nullptr;
	while (l1) {
		nextNode = l1->next;
		cur = l1;
		cur->next = res;
		res = cur;
		l1 = nextNode;
	}
	l1 = res;
}
ListNode* addTwoNumbers1(ListNode* l1, ListNode* l2) {
	//原地逆转链表
	ListNode *res = nullptr;
	ListNode *cur = nullptr;
	reverseListNode(l1);
	reverseListNode(l2);

	//对链表依次相加取余
	int jinwei = 0;
	while (l1||l2){
		int n1 = l1 ? l1->val : 0;
		int n2 = l2 ? l2->val : 0;
		int sum = n1 + n2 + jinwei;
		jinwei = sum / 10;
		//使用头插法的形式插入
		cur = new ListNode(sum % 10);
		cur->next = res;
		res = cur;

		if (l1){
			l1 = l1->next;
		}
		if (l2) {
			l2 = l2->next;
		}
	}
	if (jinwei > 0) {
		cur = new ListNode(jinwei);
		cur->next = res;
		res = cur;
	}
	return res;
}

法2:

  1. 使用两个栈分别存储两个链表中的数据,
  2. 依次从两个栈中分别弹出栈顶数据进行相加取余
  3. 结果使用头插法进行插入
    注:两个栈中的其中一个为空,则使用0代替
cpp 复制代码
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	ListNode *res = nullptr;
	ListNode *cur = nullptr;
	stack<int> s1;
	stack<int> s2;
	while (l1){
		s1.push(l1->val);
		l1 = l1->next;
	}
	while (l2) {
		s2.push(l2->val);
		l2 = l2->next;
	}
	int jinwei = 0;
	while (s1.size()>0|| s2.size() > 0){
		int n1 = s1.empty() ? 0 : s1.top();
		int n2 = s2.empty() ? 0 : s2.top();
		int sum = n1 + n2 + jinwei;
		jinwei = sum / 10;
		//头插法
		cur = new ListNode(sum % 10);
		cur->next = res;
		res = cur;

		if (s1.size() > 0){
			s1.pop();
		}
		if (s2.size() > 0) {
			s2.pop();
		}
	}
	if (jinwei > 0) {
		cur = new ListNode(jinwei);
		cur->next = res;
		res = cur;
	}
	return res;
}
相关推荐
充值内卷1 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
吞下星星的少年·-·3 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
圣保罗的大教堂3 小时前
leetcode 453. 最小操作次数使数组元素相等 中等
leetcode
aichitang20243 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
樱花树下的数学喵4 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
二本咕咕-机械转码4 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
AI吃大瓜4 小时前
指针压力表读数3:C/C++实现指针压力表读数(可实时检测)
c++·指针读数·指针压力表·压力表自动读数·压力表读数
-银雾鸢尾-4 小时前
两数之和-C++实现
c++·算法
j7~4 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法