一.题目链接:https://leetcode.com/problems/add-two-numbers

二.题目大意:

  给定两个链表,每个链表表示一个非负数,不过数字的顺序是反过来存储的,要求给出这两个非负数的和,也是用一个链表以反顺序的形式来表示。

三.题解

  该题目有以下思路:

1.两个链表都反转过来,然后遍历,用两个vector把遍历的数值存起来,之后两个vector数值对应相加(此处的相加一开始是想的是转换成int型或long型,然后数值相加;不过仔细想了想这不就是大数加法么)最后的结果反转过来再存入新链表。这种方法实现比较复杂,空间复杂度O(n),时间复杂度O(m+n),不建议用此法。

2.仔细分析下这道题目,这些数字按从左向右的顺序实际上可以看成个位、十位。。。的顺序,所以可以直接按大数加法的思想,从左向右顺序相加;结合归并排序的思想,可以直接把结果放到已知的一个链表之中,就不用额外新建链表了,代码如下:

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *p1 = l1;
ListNode *p2 = l2;
ListNode *p = p1;//最后的结果存在l1中
ListNode *q1 = new ListNode(0);//表示l1中的最后一个节点
ListNode *q2 = new ListNode(0);//表示l2中的最后一个节点
int temp = 0;//表示进位
while(p1&&p2)
{ //记录最后一个节点的位置
if(p1->next == NULL)
q1 = p1;
if(p2->next == NULL)
q2 = p2;
int _val = (p1->val + p2->val + temp) % 10;
temp = (p1->val + p2->val + temp) / 10;
p->val = _val;
p1 = p1->next;
p2 = p2->next;
p = p->next;
}
if(p1&&!p2)//p1长度大于p2的长度
{
while(p1)
{
if(p1->next == NULL)
q1 = p1;
int _val = (p1->val + temp) % 10;
temp = (p1->val+temp) / 10;
p->val = _val;
p1 = p1->next;
p = p->next;
}
//如果算完最后一个数的时候进位不为0,则链表增加一位
if(temp != 0)
{
ListNode *q = new ListNode(1);
q1->next = q;
}
return l1;
}
if(p2&&!p1){//p2的长度大于p1的长度
q1->next = p2;
p = p2;
while(p2)
{
if(p2->next == NULL)
q2 = p2;
int _val = (p2->val + temp) % 10;
temp = (p2->val+temp) / 10;
p->val = _val;
p2 = p2->next;
p = p->next; }
if(temp != 0)
{
ListNode *q = new ListNode(1);
q2->next = q;
}
return l1;
}
if(!p1&&!p2)//p1与p2的长度相同
{
if(temp != 0)
{
ListNode *q = new ListNode(1);
q1->next = q;
}
return l1;
} }
};

  该算法的时间复杂度为O(m+n),空间复杂度为O(1),但有几个需要注意的点:

1.两个链表相加时候,最后一位数计算完之后,如果进位不为0的话,就需要多增加一位,即链表多增加一个节点。

2.需要用额外的节点来记录已知链表的最后一个节点,便于后续的操作。

3.最后的计算结果存在l1中,如果l1的长度小于l2的话,还需将l1的末尾连接到l2的剩余部分(此处就会用到2中的额外节点了)。

4.关于大数加法的一个想法(与本题目关联不大):两个大数求和时,如果长度不一致的话,可通过高位补0使得两个大数的位数相同,然后求和会更加方便。

LeetCode——2. Add Two Numbers的更多相关文章

  1. LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters

    LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters 题记 刷LeetCod ...

  2. LeetCode:1. Add Two Numbers

    题目: LeetCode:1. Add Two Numbers 描述: Given an array of integers, return indices of the two numbers su ...

  3. [LeetCode] 445. Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  4. LeetCode 面试:Add Two Numbers

    1 题目 You are given two linked lists representing two non-negative numbers. The digits are stored in ...

  5. LeetCode #002# Add Two Numbers(js描述)

    索引 思路1:基本加法规则 思路2:移花接木法... 问题描述:https://leetcode.com/problems/add-two-numbers/ 思路1:基本加法规则 根据小学学的基本加法 ...

  6. [Leetcode Week15] Add Two Numbers

    Add Two Numbers 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/add-two-numbers/description/ Descrip ...

  7. [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现

    [LeetCode] Add Two Numbers 两个数字相加   You are given two non-empty linked lists representing two non-ne ...

  8. [LeetCode] 2. Add Two Numbers 两个数字相加

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  9. LeetCode之Add Two Numbers

    Add Two Numbers 方法一: 考虑到有进位的问题,首先想到的思路是: 先分位求总和得到 totalsum,然后再将totalsum按位拆分转成链表: ListNode* addTwoNum ...

  10. LeetCode 2. add two numbers && 单链表

    add two numbers 看题一脸懵逼,看中文都很懵逼,链表怎么实现的,点了debug才看到一些代码 改一下,使本地可以跑起来 # Definition for singly-linked li ...

随机推荐

  1. Orcal数据库12c安装完成后注意事项

    1.按照12c的安装使用装完数据库后,使用navicat链接orcal数据库时无法使用. 点击此处查看安装方案 2. 2048错误,ORA-28040: No matching authenticat ...

  2. Mysql 创建数据库命令

    GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...

  3. tumblr热度

  4. lame定理求欧几里得算法的求余和赋值次数

    根据lame定理,根据欧几里得算法求(a,b)的最大公因数过程如下(假设a>b):

  5. xdoj--1144 (合并模板)--有趣的优先队列(优先队列默认权值最大的数在前面)

    我觉得这道题出的很好 区别于“哈夫曼树” 因为事之多合并k个 理论说尽可能多合并. 然后我们看一个简单的例子 4 3 1 2 3 4  ——>6 4——>10 (6+10)=16: 1 2 ...

  6. SpringMVC整合Thymeleaf

    Thymeleaf的介绍 进行JavaWeb开发时主要用到的是JSP,传统的JSP需要在页面中加入大量的JSTL标签,这些标签只能运行在服务器中,前端开发人员维护这些页面比较困难,页面加载速度也比较慢 ...

  7. hdu2461 Rectangles 线段树--扫描线

    You are developing a software for painting rectangles on the screen. The software supports drawing s ...

  8. diskcache

    DiskCache: Disk Backed Cache DiskCache is an Apache2 licensed disk and file backed cache library, wr ...

  9. VM安装系统时提示硬件不支持(unsupported hardware detected)

    修改一下虚拟机配置,把CD/DVD中使用的autoinst.iso替换成需要安装的系统镜像文件 然而,后面发现还是会报这个错,不过,却可以正常安装下去.但是如果不修改这里的话,安装系统时会出错

  10. MySQL--InnoDB并发线程控制

    InnoDB并发线程控制 MySQL InnoDB存储引擎提供innodb_thread_concurrency来控制进入InnoDB 存储引擎的线程数,以限制InnoDB存储引擎层的并发量. 当in ...