1. 题号和题目名称
- 两数相加 II
2. 题目叙述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 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]
3. 模式识别
本题需要处理两个链表表示的整数相加,由于链表中数字的存储顺序是从高位到低位,与常规加法从低位开始计算的方式不同。可以使用栈来解决,将链表元素依次入栈,然后从栈顶取出元素进行相加,模拟加法运算的过程。
4. 考点分析
- 链表操作:对链表进行遍历、创建新节点等操作。
- 栈的应用:利用栈来存储链表元素,实现逆序处理。
- 加法运算模拟:模拟整数加法的过程,包括进位处理。
5. 所有解法
- 栈解法:使用栈存储链表元素,然后进行相加操作,是本题的主要解法。
- 递归反转链表解法:先递归反转链表,进行相加后再反转结果链表,但由于题目进阶要求不能修改输入链表,该方法在这种情况下不适用。
6. 最优解法(栈解法)的 C 语言代码
#include <stdio.h>
#include <stdlib.h>
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
// 此函数用于将两个用链表表示的整数相加
// l1: 第一个链表的头节点指针,代表一个整数,链表从高位到低位存储数字
// l2: 第二个链表的头节点指针,代表另一个整数,链表从高位到低位存储数字
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
// 两个栈,由于最大链表节点个数是100个,所以栈的大小设为100
int stack1[100];
int stack2[100];
// 栈1的栈顶指针,初始化为 -1 表示栈为空
int top1 = -1;
// 栈2的栈顶指针,初始化为 -1 表示栈为空
int top2 = -1;
// 表示进位,初始化为 0
int decimal = 0;
// 两个链表入栈操作
// 遍历链表 l1,将节点的值依次压入栈1
while (l1

464

被折叠的 条评论
为什么被折叠?



