「这是我参与11月更文挑战的第 11 天,活动详情查看:2021最后一次更文挑战」
刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能
链表中的两数相加
题目描述
给定两个 非空链表 l1
和 l2
来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表
可以假设除了数字 0 之外,这两个数字都不会以零开头
示例
示例 1
1 | css复制代码输入:l1 = [7,2,4,3], l2 = [5,6,4] |
示例 2
1 | css复制代码输入:l1 = [2,4,3], l2 = [5,6,4] |
示例 3
1 | css复制代码输入:l1 = [0], l2 = [0] |
提示:
- 链表的长度范围为
[1, 100]
0 <= node.val <= 9
- 输入数据保证链表代表的数字无前导 0
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转
解题
思路
这个题在前边已经做过类似的,就是大数相加。思路差不多,这个稍微不一样的地方就是,它的高位存在了链表的前边,低位在后边。因为是单向链表,我们不能说让指针指向尾部,然后往前遍历来进行求和
因为这跟我们求和是反着来的,很容易就想到用栈这种数据结构。先分别遍历这两个链表,然后将链表的元素分别压入各自的栈中,然后逐个从栈中弹出元素进行求和(求和过程很简单,注意进位就行了),将每次的计算结果创建一个结点,按照尾插法插入到新的链表尾部即可
代码
1 | go复制代码//栈实现 |
本文转载自: 掘金