博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PigyChan_LeetCode 445. 两数相加 II
阅读量:3945 次
发布时间:2019-05-24

本文共 1859 字,大约阅读时间需要 6 分钟。

445. 两数相加 II

难度中等

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

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

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 8 -> 0 -> 7
在我看来这题的难点在于进位

思路1.0:

(1)遍历两条链表,得到两链表长度,big,small分别存储较长边和较短边

(2)以较长链表为基构造ans链表,该链表以一个值为0的节点为头,为进位提供空间
(3)将较短链表加入ans
(4)。。。意识到要使用stack,那为啥不在一开始就用呢。。

思路2.0:

(1)遍历两条链表,将两链表压入两个栈。

(2)最后通过两个栈一起弹出元素,模拟两数从个位开始相加,记录进位,并将最终和作为val来构造ans链表。

代码1.0:

class Solution {
public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* cur1 = l1; ListNode* cur2 = l2; stack
stk1; stack
stk2; while (cur1 != NULL) {
stk1.push(cur1->val); cur1 = cur1->next; } while (cur2 != NULL) {
stk2.push(cur2->val); cur2 = cur2->next; } ListNode* after = NULL; bool isCarry = false; while (!stk1.empty() || !stk2.empty()) {
int val1 = 0; int val2 = 0; if (!stk1.empty()) {
val1 = stk1.top(); stk1.pop(); } if (!stk2.empty()) {
val2 = stk2.top(); stk2.pop(); } int newVal = val1 + val2 + isCarry; //存在进位 if (newVal >= 10) {
newVal = newVal % 10; isCarry = true; } //没有进位 else {
isCarry = false; } ListNode* newNode = new ListNode(newVal); newNode->next = after; after = newNode; } if (isCarry) {
ListNode* newNode = new ListNode(1); newNode->next = after; after = newNode; } return after; }};

以后看到两数相加要第一时间想到栈

在这里插入图片描述

效率还是不咋地,去题解逛逛

转载地址:http://bvowi.baihongyu.com/

你可能感兴趣的文章
EXE破解工具介绍
查看>>
机械码对应值
查看>>
常用语音编码的WAVE文件头格式剖析--各种编码
查看>>
在VC6集成环境中开发设备驱动程序的方法
查看>>
如何进行软件需求分析
查看>>
有关数据挖掘的10个常见问题
查看>>
电信数据挖掘
查看>>
电信数据挖掘之流失管理
查看>>
电信运营商如何进行客户细分
查看>>
c++名库介绍
查看>>
boost1.43在win7下的编译
查看>>
VC++工程如何脱离VSS环境
查看>>
转 hook 自绘原理
查看>>
NSIS 脚本介绍
查看>>
记录通讯日志的函数
查看>>
c++ 标准容器介绍与对比
查看>>
web DB优化思路
查看>>
敏捷笔记
查看>>
SOA业务理解与应用
查看>>
Google File System(中文翻译)
查看>>