当前位置:首页 > 牛客 > 牛客BM11题解析:链表相加的栈解法

牛客BM11题解析:链表相加的栈解法

4个月前 (08-08)

牛客BM11题解析:链表相加的栈解法 牛客BM题 链表相加 栈 头插法 数学逻辑 C++ 链表 模拟 第1张

一、题目解读

牛客BM11题要求实现两个链表的相加操作,即将两个链表对应节点的值相加,并返回相加后的结果链表。题目考察的核心在于如何处理链表的逆序相加与进位问题,需要兼顾数据结构操作与数学逻辑的结合。

二、解题思路

采用“+逆序处理”策略,巧妙避开链表顺序遍历的麻烦。思路如下:

1. 逆序存储:利用栈的先进后出特性,将两个链表元素分别压入栈s1和s2,实现链表元素的逆序访问(从尾到头)。

2. 同步相加:通过循环遍历栈顶元素,模拟手动加法过程:逐位相加、处理进位(carry)、构建新节点。

3. 头插法构建结果:每次将新节点插入到结果链表头部(head),确保最终结果链表顺序正确。

三、解题步骤

1. 初始化栈与变量:创建两个栈s1、s2,用于存储链表元素;定义carry(进位)与结果链表头节点res。

2. 逆序压栈:通过循环遍历head1、head2,将节点值依次压入栈,实现链表元素的逆序存储。

3. 栈顶元素相加:

    循环条件:任一栈非空或存在进位(carry>0)。

    计算当前位和sum:取两栈顶元素(若栈空则忽略)+ 进位。

    更新进位:sum/10,取整数部分。

    构建新节点:sum%10(取余数),头插法插入res链表。

4. 返回结果链表:最终res即为相加后的正确顺序链表。

四、代码与注释

class Solution {
public:
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        stack<int> s1, s2; // 创建栈存储逆序链表元素

        // 将链表1逆序压栈
        while (head1) {
            s1.push(head1->val);
            head1 = head1->next;
        }
        // 将链表2逆序压栈
        while (head2) {
            s2.push(head2->val);
            head2 = head2->next;
        }

        int carry = 0; // 进位标志
        ListNode* res = nullptr; // 结果链表头节点

        // 从低位到高位逐位相加
        while (!s1.empty() ||!s2.empty() || carry) {
            int sum = carry; // 当前位和初始值为进位
            if (!s1.empty()) { // 若栈1不空,加入当前元素
                sum += s1.top();
                s1.pop();
            }
            if (!s2.empty()) { // 若栈2不空,加入当前元素
                sum += s2.top();
                s2.pop();
            }
            carry = sum / 10; // 更新进位
            ListNode* node = new ListNode(sum % 10); // 创建新节点(取余数)
            node->next = res; // 头插法插入节点
            res = node;
        }
        return res;
    }
};

五、总结

本解法通过栈的逆序处理,将链表相加转化为简单的栈顶元素逐位相加问题,避免了复杂的指针操作递归。核心优势在于:

● 时间复杂度O(max(n,m)):n、m为两链表长度,仅需一次遍历+栈操作。

● 空间复杂度O(n+m):栈存储链表元素。

● 代码简洁性:头插法直接构建结果链表,无需额外反转或调整顺序。

该思路适用于链表中“从尾到头”操作的通用场景,是解决此类问题的经典方法。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。