一、题目要求

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

二、我的解法及其错误之处

由于english比较low,理解上述题目还是花了点时间。

题目看懂了,确实不难,涉及结构体、指针,求和。

然后就开工,直接在线写代码,编译通过,但是提交后报错了:

1.第一次错误是Runtime Error,具体错误是

signed integer overflow: 1000000000000000000 * 10 cannot be represented in

2.第二次错误AddressSanitizer: heap-use-after-free on address 0x602000000118 at pc 0x000000462f75 bp 0x7fff9680bfd0 sp 0x7fff9680bfc8

后来仔细考虑了一下,我做的过程是:

将链表转换为一个整数(用了long long),然后求和,最后转换为一个链表返回。

这个题目,我考虑复杂了。错误之处在于链表表示的数,可以非常大,也可以是0。

下面是我的错误代码:

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
long long n1 = 0;
long long n2 = 0;
long long result = 0;
long long t = 1;
ListNode *p = l1;
while(p != NULL){
n1 = n1 + t* p->val;
t = t* 10;
p = p->next;
} p = l2;
t = 1;
while(p != NULL){
n2 = n2 + t* p->val;
t = t * 10;
p = p->next;
}
result = n1 + n2; ListNode * pHead = NULL;
if(result == 0){
return pHead = new ListNode(0);
}
while(result>0){
if(pHead == NULL){
pHead = new ListNode(result % 10);
}else{
p = pHead;
while(p->next !=NULL){
p = p ->next;
}
p->next = new ListNode(result % 10);
} result = result / 10;
}
return pHead;
}
};

直接链表对应为求和,然后返回链表就可以了,这个反而更简单。完整的代码如下:

#include<iostream>
using namespace std; struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode head(0),*curr = & head;
int remain=0,tmp;
while(l1!=NULL && l2!=NULL){
tmp = l1->val + l2->val + remain;
curr -> next = new ListNode(tmp % 10);
curr = curr->next;
l1 = l1->next;
l2 = l2->next;
remain = tmp / 10;
}
while(l1 !=NULL){
tmp = l1->val + remain;
curr->next = new ListNode(tmp % 10);
curr = curr->next;
l1 = l1->next;
remain = tmp / 10;
}
while(l2 !=NULL){
tmp = l2->val + remain;
curr->next= new ListNode(tmp % 10);
curr = curr->next;
l2 = l2->next;
remain = tmp /10;
}
if(remain !=NULL){
curr->next = new ListNode(remain);
}
return head.next;
}
}; int main(){
Solution s;
ListNode * l1,*l2,*curr; //初始化 l1 2->4->3
l1= new ListNode(2);
curr = l1;
curr->next = new ListNode(4);
curr = curr->next;
curr->next = new ListNode(3);
curr = curr->next; //初始化 l2 5->6->4
l2= new ListNode(5);
curr = l2;
curr->next = new ListNode(6);
curr = curr->next;
curr->next = new ListNode(4);
curr = curr->next; ListNode * l3 = s.addTwoNumbers(l1,l2); //输出结果
curr = l3;
while(curr!=NULL){
cout<<curr->val<<" ";
curr= curr->next;
} return 0;
}

刷题2. Add Two Numbers的更多相关文章

  1. LeetCode刷题系列——Add Two Numbers

    题目链接 这个题目很简单,归并而已,好久没练编程,居然忘了在使用自定义类型前,要进行初始化(new操作). class ListNode{ int val; ListNode next; ListNo ...

  2. 【LeetCode刷题系列 - 002题】Add Two Numbers

    题目: You are given two non-empty linked lists representing two non-negative integers. The digits are ...

  3. LeetCode第四题,Add Two Numbers

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

  4. 【LeetCode每天一题】Add Two Numbers(两链表相加)

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

  5. LeetCode第二题:Add Two Numbers

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

  6. LeetCode刷题笔录Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

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

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

  8. (python)leetcode刷题笔记 02 Add Two Numbers

    2. Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. ...

  9. 周刷题第一期总结(two sum and two numbers)

    由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的 ...

随机推荐

  1. unserialize():Error at offset 0 of 96 bytes是什么意思

    数据库有个列是数组序列化后存到数据库的,取出来得反序列化, php想要把数组保存到数据库里,有两种序列化方式,分别是: //php系统序列化 $b = serialize($a);    //序列化数 ...

  2. Turtle模块基本方法和使用(画布)

      方法 简写 描述 例子 移动和绘制 forward() fd() 前进 turtle.forward(10):前进10个单位 backward() bk().back() 后退 turtle.ba ...

  3. CSS的模板资源+编辑图像大小

    模板资源 源码之家搜登录页面,链接:https://www.mycodes.net/190/10144.htm        (或者搜门户网站 模板之家,里面页面更强大!) 编辑图像大小      然 ...

  4. [HNOI2003] 消防局的设立 - 树形dp

    仍然是点覆盖集问题,但覆盖半径变成了\(2\) 延续上一题的思路,只是式子更加复杂了 想体验一下min_element大法于是不想优化了 #include <bits/stdc++.h> ...

  5. 左边div固定宽度,右边div自适应撑满剩下的宽度--实现方法汇总

    神奇的事 其实有的方法(float.position.margin.flex)是有border像素的差 代码如下: <!DOCTYPE html><html><head ...

  6. Selenium3+python自动化011-unittest生成测试报告(HTMLTestRunner)

    批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTest ...

  7. Python标准库之sys模块

    获取Python解释器的版本信息 import sys print(sys.version) #输出 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) ...

  8. c++ 踩坑大法好 枚举

    1,枚举是个啥? c++允许程序员创建自己的数据类型,枚举数据类型是程序员自定义的一种数据类型,其值是一组命名整数常量. ,wed,thu,fri,sat,sun}; //定义一个叫day的数据类型, ...

  9. Django文件夹

    Django文件 App文件夹 migrations文件 生成models创建表的翻译语句 telemplatetags文件夹 telemplatetags文件夹下的文件专门用来创建自定义标签.自定义 ...

  10. vue学习指南:第十三篇(详细) - Vue的 路由 第三篇 ( 路由的缓存 )

    路由的缓存 路由缓存是 Vue组件优化的一个重要方法 为什么实现路由缓存? 为了 组件间 相互切换不会重复加载数据,影响用户体验,我们通常需要将组件的数组实现缓存,当我们点过来,在点的时候会再次发送 ...