Leetcode(2)-两数相加(包含链表操作的注意事项)
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:类似于将两个链表融合成一个链表,首先如果有一个链表为空,那么就返回另外一个链表的头结点。如果都不为空,就可以进行相加操作,这里涉及到求和和保存进位的操作。我下面主要记录新建链表的过程中需要注意的地方。
(1)如果newhead = 已有的链表,那么newhead->next是有效的,相当于新建的链表指向了已有的链表,只要已有的这个链表有后面的节点,那么访问next就是合法的
(2)如果我们的做法是新建一个链表的头结点,准备一个个的自己加节点,那么就要注意一定要提前申请好下一个节点的空间,才能对newhead->next做操作
(3)一般在链表的定义部分,要定义一个初始化函数,比如将val初始化为num,将next指针定义为NULL。这样方便初始化一个单独的节点。这样初始化的结果是什么呢。比如ListNode* p= new ListNode(0); 就是p的当前值是0,p->next中val未知,next未知。这个时候可以对p->next做NULL判断,但不可以做其他赋值的操作,否则会有内存访问出错。
(4)如果要加入节点的话。尽量对下一节点做处理,比如我想在链表加入一个值,那么如果p->val=num的话,这个时候p->next是未知的状态,p=p->next这句话没错,这个相当于现在p是未知的状态了。如果还想加入一个值,就很麻烦了,直接用p->val=num会出现内存出错,因为这个时候的p已经是不可访问的了。所以尽量p->next = new ListNode(num),p=p->next。这样p永远指向链表尾端,不加新节点,也不会多申请,加的话,申请一个新的,加到后面。但是这样返回的值,要变成head->next
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode *first=l1,*sec=l2,*result;
if(first==NULL) return l2;
if(sec==NULL) return l1;
int sum = 0,carry =0;
result = new ListNode;
ListNode* p = result;
while(first && sec)
{
sum= first->val + sec->val + carry;
p->next = new ListNode(sum%10);
carry = sum/10;
p=p->next;
first=first->next;
sec=sec->next;
}
if(first)
{
p->next=first;
}
else if(sec)
{
p->next=sec;
}
while(carry !=0 && p->next !=NULL)
{
p=p->next;
p->val += carry;
carry = 0;
if(p->val>9)
{
p->val -= 10;
carry = 1;
}
}
if(carry)
{
p->next = new ListNode(carry);
}
return result->next;
}
最后要注意,当两个链表都遍历结束的时候,还要判断下carry位,是1的话,需要再增加一位的,否则会丢失最高位
Leetcode(2)-两数相加(包含链表操作的注意事项)的更多相关文章
- LeetCode 445——两数相加 II
1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...
- Leetcode 002. 两数相加
1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- LeetCode 2——两数相加(JAVA)
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- 【LeetCode】两数相加
题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. ...
- Leetcode 445. 两数相加 II
1.题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. ...
- LeetCode 445. 两数相加 II(Add Two Numbers II)
445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...
- Java实现 LeetCode 2 两数相加
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- leetcode TOP100 两数相加
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- LeetCode 2. 两数相加(Add Two Numbers)
2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...
随机推荐
- 别再问我们用什么画图的了!问就是excalidraw
每次发 https://github.com/tal-tech/go-zero 相关文章时,都会有读者问我们用什么画图的. 这图什么工具画的呀?好看! 这个手绘风格真好看,用啥工具画的呀? 可不可以介 ...
- gRPC-go源码(1):连接管理
1 写在前面 在这个系列的文章中,我们将会从源码的层面学习和理解gRPC. 整个系列的文章的计划大概是这样的:我们会先从客户端开始,沿着调用路径逐步分析到服务端,以模块为粒度进行学习,考虑这个模块是为 ...
- 华为三层交换机限制vlan段的指定端口
屏蔽vlan 120这个段的ip的所有2333端口 [NTT_3L]int Vlanif 120 [NTT_3L-Vlanif120]dis this # interface Vlanif120 ip ...
- (转)iOS工具--CocoaPods 安装使用总结
本文转载自:CocoaPods 安装使用总结(最新) 一.前言 关于什么是CocoaPods,使用CocoaPods的好处等问题本文不做说明,本文只是CocoaPods的安装和使用教程.根据此教程可以 ...
- HTTPS学习(一):准备知识
div.example { background-color: rgba(229, 236, 243, 1); color: rgba(0, 0, 0, 1); padding: 0.5em; mar ...
- 初始TypeScript
什么是TypeScript? TypeScript是拥有类型系统的JavaScript的超集,可以编译成纯JavaScript: 1.类型检查:TS会在编译代码时进行严格的静态类型检查,这意味着可以在 ...
- Autofac for AutoMapper
我一直在做的事情.NET 开发已经有一段时间了.有时人们问我,为什么我仍然觉得它有趣.答案很简单: 我是超级 d.r.y.如果你不熟悉这个术语,你应该查一下,但它基本上意味着你应该总是尝试应用那些可以 ...
- 【进阶】ZooKeeper 相关概念总结
1. 开卷有益 学习是一种习惯,只有把这种习惯保持下来,每天不学习一点就感觉浑身不自在,达到这样的境界,那么你成为大佬也就不远了买,正如我们标题所写的"开卷有益".人生匆匆,要想过 ...
- cdq分治 笔记
算法讲解 这个算法用于解决三维偏序问题. 三维偏序:给定 \(n\) 个三元组: \((a_i,b_i,c_i)\),求同时满足满足 \(a_i\le a_j,b_i\le b_j,c_i\le c_ ...
- js部分知识整理,google浏览器的代码调试
整理一些学过的js知识点,包括js中3个括号的含义,this的使用,递归,google浏览器的代码调试.Location的属性及常用方法,window对象常用方法,open方法等. js括号 在js中 ...