445. 两数相加 II

1. 题号和题目名称

  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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值