两数相加

题目:

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

示例:

输入:(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. [转]vue - 前置工作 - 目录功能介绍

    一个DEMOS的完整目录(由于GWF问题,我就不一一打开网站一个个去搜索并且解释了)可以去关注:https://www.cnblogs.com/ye-hcj build build.js(本文来自ht ...

  2. Python--day41--thread1.join()

    在 Python 的多线程编程中,在实例代码中经常有 thread1.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. join的原理就是依次检验线程池中的线程是否结束 ...

  3. python基础十二之生成器进阶

    生成器表达式 (满足条件的元素或其相关的操作 for 元素 in 可迭代对象 if 条件) g = (i for i in range(10)) for i in g: print(i) egg_li ...

  4. 【9001】Internet消息发布

    Time Limit: 1 second Memory Limit: 256 MB 问题描述 设Internet上有N个站点,通常从一个站点发送消息给其他N-1个站点,需依次发送N-1次.这样从一个站 ...

  5. P1091 剧院广场

    题目描述 柏林首都的剧院广场呈长方形,面积为 \(n \times m\) 平方米.在这座城市的周年纪念日之际,人们决定用方形花岗岩石板铺设广场.每块石板的大小都是 \(a \times a\) . ...

  6. H3C 配置路由器作为FTP客户端

  7. H3C配置BPDU的生成和传递

  8. 深度解读 - TDD详细(测试驱动开发)

    本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driv ...

  9. H3C使用ping命令--用户视图

    完整的ping命令,用于下面参考 <H3C>ping 1.1.1.1   PING 1.1.1.1: 56  data bytes, press CTRL_C to break     R ...

  10. MD5登陆密码的生成

    package com.cinc.ecmp.userpermission.utils; import java.security.MessageDigest;import java.security. ...