两数相加

题目:

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

示例:

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

输出:7 -> 0 -> 8

原因:342 + 465 = 807

思路:

1.定义一个带头结点的链表同时定义一个指针指向该结点

2.定义两个指针分别指向两个链表的头结点

3.定义一个int的进位标志c

4.循环遍历两个链表对应结点的值相加然后和10取余获取当前结点的值,做除法运算获取是否需要近卫,结果链表采用尾插法保证顺序

5.遍历结束后,判断最后一位相加的结果是否有进位,如果进位标志大于0说明有进位在插入一个进位结点

代码:

第一版:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode res(-1);
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* pRes = &res;
int c = 0;
while (p1 != NULL || p2 != NULL)
{
int pA = p1 == NULL ? 0 : p1->val;
int pB = p2 == NULL ? 0 : p2->val;
int tmp = pA + pB + c;
c = tmp / 10;
pRes->next = new ListNode(tmp % 10);
pRes = pRes->next;
p1 = p1 == NULL ? NULL : p1->next;
p2 = p2 == NULL ? NULL : p2->next;
}
if (c > 0)
{
pRes->next = new ListNode(c);
}
return res.next;
}

第二版:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode res(-1);
ListNode* pRes = &res;
int c = 0;
while (l1 != NULL || l2 != NULL)
{
int pA = l1 == NULL ? 0 : l1->val;
int pB = l2 == NULL ? 0 : l2->val;
int tmp = pA + pB + c;
c = tmp / 10;
pRes->next = new ListNode(tmp % 10);
pRes = pRes->next;
l1 = l1 == NULL ? NULL : l1->next;
l2 = l2 == NULL ? NULL : l2->next;
}
if (c > 0)
{
pRes->next = new ListNode(c);
}
return res.next;
}

终版:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode res(-1);
ListNode* pRes = &res;
int c = 0;
while (l1 != NULL || l2 != NULL)
{
int tmp = c;
if (l1 !=NULL)
{
tmp += l1->val;
l1 = l1->next;
}
if (l2 != NULL)
{
tmp += l2->val;
l2 = l2->next;
} c = tmp / 10;
pRes->next = new ListNode(tmp % 10);
pRes = pRes->next;
}
if (c > 0)
{
pRes->next = new ListNode(c);
}
return res.next;
}

总结:

1.第一版就是按照思路一步一步完成的。

2.第二版去掉了临时变量,直接遍历两个链表,以减少内存开销

3.终版是去掉了两次重复的判断,以减少时间开销

4.结果的存储采用尾插法



leetcode腾讯精选练习之两数相加的更多相关文章

  1. leetcode 刷题(2)--- 两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  2. 【LeetCode】2. Add Two Numbers 两数相加

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

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

    题目标签:Linked List 题目给了我们两个 数字的linked list,让我们把它们相加,返回一个新的linked list. 因为题目要求不能 reverse,可以把 两个list 的数字 ...

  4. [leetcode]445. Add Two Numbers II 两数相加II

    You are given two non-empty linked lists representing two non-negative integers. The most significan ...

  5. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  6. LeetCode(2): 两数相加

    本内容为LeetCode第二道题目:两数相加 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 10:47:12 201 ...

  7. 【LeetCode题解】2_两数相加

    目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...

  8. LeetCode 445——两数相加 II

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

  9. Leetcode 445. 两数相加 II

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

随机推荐

  1. hdu 1548 A strange lift(迪杰斯特拉,邻接表)

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. Python--day64--Bootstrap样式的使用

    Bootstrap样式网址:https://v3.bootcss.com

  3. Python--day61--Django ORM关系的简单梳理

    models.py中的代码和数据库中的表对应

  4. vue 改变数据DOM不更新,获取不到DOM的解决方法

    1.获取不到DOM的解决方案(使用$nextTick) 定义:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 理解:nextTick(),是将回调 ...

  5. Linux 内核 动态设备

    术语"热插拔"最普遍使用的意义产生于当讨论这样的事实时, 几乎所有的计算机系统现在 能够处理当系统有电时设备的出现或消失. 这非常不同于只是几年前的计算机系统, 那时 程序员知道他 ...

  6. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

  7. LuoguP3066 逃跑的BarnRunning Away From…

    LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...

  8. Netty小结

    前言 在实际开发中,netty的开发使用相对较小,why?在企业中涉及网络编程的部分比重较小,在这大环境内,企业会优先使用简单的http,udp等基础的通讯协议工具,如果不能满足需求,会考虑基于rpc ...

  9. Openstack生产环境部署(一)

  10. docker ps 显示指定的列

    可以自己指定显示的模板,例如: docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" table - 表示显示表头列 ...