两数相加

题目:

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

示例:

输入:(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. 在字符串中查找id值MySQL

    PHPmyadmin中sql语句 SELECT * FROM `hz_article_type` WHERE FIND_IN_SET( 5, items_id ) LIMIT 0 , 30 结果: S ...

  2. Python 3.7.0 For Mac版软件安装教程附下载地址

    https://www.jianshu.com/p/f02d6f01eba7

  3. Jenkins安装总结

    Jenkins官方文档说的安装步骤,http://jenkins.io/zh/doc/pipeline/tour/getting-started/ 相关安装资源可在官方文档下载 安装Jenkins之前 ...

  4. hibernate无限递归问题

    项目异常如下: 2018-01-26 17:12:38.162 WARN 3128 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionReso ...

  5. Python--day41--递归锁Rlock

    1,递归锁Rlock:递归锁是为了解决死锁问题,且递归锁的特点是在同一个线程中可以被acquire()多次 多个acquire()在递归锁中不会阻塞,而互斥锁Lock就会阻塞 代码示例: from t ...

  6. H3C 基本的局域网间路由

  7. 用一篇文章了解ppi,dpr,物理像素,逻辑像素,以及二倍图

    这篇文章能让你了解到什么是分辨率.dpr.dip.ppi (dpi相当于ppi,dpi用点表示物理像素密度,ppi是逻辑像素密度) 首先从最简单的ppi开始: 一部手机,有大有小,怎么知道手机的大小用 ...

  8. springboot上传文件时500错误,提示临时目录无效

    org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nes ...

  9. javascript基础之数组一

    <script type="text/javascript"> //求数组中最大的数 var arr=[123,456,789,657,432,564]; var ar ...

  10. 用ubuntu里的vim搭建一个apache2+php+mysql环境一路踩的坑

    先是安装apache2,这个很顺利,一个apt install apache就搞定了. (PS:查看linux是否已经安装了apache服务,可以通过执行apachectl -v,如果安装了的话会显示 ...