刷题2. Add Two Numbers
一、题目要求
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的更多相关文章
- LeetCode刷题系列——Add Two Numbers
题目链接 这个题目很简单,归并而已,好久没练编程,居然忘了在使用自定义类型前,要进行初始化(new操作). class ListNode{ int val; ListNode next; ListNo ...
- 【LeetCode刷题系列 - 002题】Add Two Numbers
题目: You are given two non-empty linked lists representing two non-negative integers. The digits are ...
- LeetCode第四题,Add Two Numbers
题目原文: You are given two linked lists representing two non-negative numbers. The digits are stored in ...
- 【LeetCode每天一题】Add Two Numbers(两链表相加)
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- LeetCode第二题:Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- LeetCode刷题笔录Add Binary
Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...
- LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters
LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters 题记 刷LeetCod ...
- (python)leetcode刷题笔记 02 Add Two Numbers
2. Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. ...
- 周刷题第一期总结(two sum and two numbers)
由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的 ...
随机推荐
- vue.js事件传值之子组件传向父组件以及$emit的使用
在项目开发中,有时候会遇到一种需求比如是:在子组件中,通过一个事件,比如点击事件,去改变父组件中的某个值,下面来看看是怎么个流程 还是先截图目录结构 父组件为app.vue,components中的文 ...
- C++常见编译问题记录
1.类名重复问题 在同一个项目下,分文件编译时,所有的文件最后会被编译到一个可执行程序或dll中,所以同一个项目下文件中不能出现两个相同的类名,否则编译器无法区分使用的到底是那个类,就会出现LINK2 ...
- dos命令获取系统时间与变量定义
1.获取系统时间及格式化 参考文章: 1.1 cmd下获取系统时间 1.2 获取系统时间的DOS命令 2.变量定义 https://www.jb51.net/article/49197.htm 3.使 ...
- WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
该问题出现在WPF中的VM类中,ObservableCollection类型,该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改, ...
- How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Written by Rahul, Updated on April 3, 20
本文系转载备份 请阅读点击下面链接阅读原文以获取更佳地阅读体验.谢谢. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Writt ...
- Currency Exchange POJ - 1860 spfa判断正环
//spfa 判断正环 #include<iostream> #include<queue> #include<cstring> using namespace s ...
- host文件无写权限时,怎么设置
点击文件属性---安全---选择对应的用户---编辑属性---勾选需要的属性---应用---确定
- python2.6升级python2.7后,yum不能用了,如何解决
背景: 跑python的case时候,发现log功能不好用,于是升级了python2.6-->python2.7 but,升级之后,发现yum命令不好用了.怎么办? 百度搜了一下,如何解决: 参 ...
- 小程序 与 App 与 H5 之间的区别
小程序的实现原理 根据微信官方的说明,微信小程序的运行环境有 3 个平台,iOS 的 WebKit(苹果开源的浏览器内核),Android 的 X5 (QQ 浏览器内核),开发时用的 nw.js(C+ ...
- thinkphp中如何用路由调用前台html界面
先上图片看看基本的文件位置 1.首先在application\route.php中定义路由 <?php use think\Route; Route::get("home", ...