给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 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)-两数相加(包含链表操作的注意事项)的更多相关文章

  1. LeetCode 445——两数相加 II

    1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...

  2. Leetcode 002. 两数相加

    1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...

  3. LeetCode 2——两数相加(JAVA)

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  4. 【LeetCode】两数相加

    题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. ...

  5. Leetcode 445. 两数相加 II

    1.题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. ...

  6. LeetCode 445. 两数相加 II(Add Two Numbers II)

    445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...

  7. Java实现 LeetCode 2 两数相加

    两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  8. leetcode TOP100 两数相加

    两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  9. LeetCode 2. 两数相加(Add Two Numbers)

    2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...

随机推荐

  1. LuoguP5075 [JSOI2012]分零食

    题意 有\(A\)个人,\(m\)个糖,你可以选择一个\(k\),使第\(1\)$k$个人每个人至少得到一个糖,并且第$k+1$\(A\)个人都得不到糖.\(m\)个糖必须给完.对于每个方案都有一个欢 ...

  2. 权限管理3-整合Spring Security

    一.Spring Security介绍 1.框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安 ...

  3. python多线程和GIL全局解释器锁

    1.线程     线程被称为轻量级进程,是最小执行单元,系统调度的单位.线程切换需要的资源一般,效率一般.  2.多线程         在单个程序中同时运行多个线程完成不同的工作,称为多线程 3.并 ...

  4. jQuery 多选与清除

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 重绘和回流(Repaint & Reflow)总结,以及如何进行优化

    1. 浏览器渲染机制 浏览器采用流式布局模型(Flow Based Layout) 浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了渲染树(Render Tre ...

  6. JQuery——基本概念

    ###JQuery语法 格式:$(selector).action() 美元符号$本身是JQuery对象的缩写 选择符selector查询和查找HTML元素 Action执行对元素的操作 ###JQu ...

  7. 排查 Linux 系统运行速度慢

    排查 Linux 系统运行速度慢 一.检查CPU信息 二.使用top检查cpu负载 三.iotop进行检查 四.检查启动的服务 五.free检查闲置内存空间 一.检查CPU信息 在 Linux 系统中 ...

  8. hadoop知识点总结(一)hadoop架构以及mapreduce工作机制

    1,为什么需要hadoop 数据分析者面临的问题 数据日趋庞大,读写都出现性能瓶颈: 用户的应用和分析结果,对实时性和响应时间要求越来越高: 使用的模型越来越复杂,计算量指数级上升. 期待的解决方案 ...

  9. ceph ---(ceph简介)

    ceph简介: Ceph是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中 ...

  10. MIT 6.S081 聊聊xv6中的文件系统(上)

    前言 Lab一做一晚上,blog一写能写两天,比做Lab的时间还长( 这篇博文是半夜才写完的,本来打算写完后立刻发出来,但由于今天发现白天发博点击量会高点,就睡了一觉后才发(几十的点击量也是点击量啊T ...