刷题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)
由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的 ...
随机推荐
- LeetCode Two Sum&Two Sum II - Input array is sorted&3Sum&4Sum 一锅煮题解
文章目录 Two Sum Two Sum II 3Sum 4Sum Two Sum 题意 给定一个数组,和指定一个目标和.从数组中选择两个数满足和为目标和.保证有且只有一个解.每个元素只可以用一次. ...
- IOU 选框和真实框重叠部分占两个总框并集的比例
IOU 选框和真实框重叠部分占两个总框并集的比例 IOU 召回率:表示在预测为的正类中,有多少正类被预测为正类 https://blog.csdn.net/qq_36653505/article/de ...
- mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天等等
转自: https://blog.csdn.net/min996358312/article/details/61420462 1.当函数使用时,即interval(),为比较函数,如:interva ...
- Hadoop 集群ssh免密登录设置
0.安装命令: yum list installed | grep openssh-server 命令检查ssh安装有没有安装,如果查询出来有就表示安装了,否则反之 通过 yum install op ...
- Linux系统搭建Java环境【JDK、Tomcat、MySQL】一篇就够
前言:所有项目在完成开发后都会部署上线的,一般都是用Linux系统作为服务器的,很少使用Windows Server(大多数项目的开发都是在Windows桌面系统完成的),一般有专门负责上线的人员 ...
- C 库函数 - strcpy()
描述 C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest. 需要注意的是如果目标数组 dest 不够大,而源字符 ...
- C++-CodeForces-1313A
真的打起比赛来,连个贪心都写不好,呜呜呜. #include <bits/stdc++.h> using namespace std; ],t,ans; void IF(int&a ...
- vue老项目升级vue-cli3.0
第一步我们卸载全局的vue2.0然后: 打开命令行 输入npm install -g @vue/cli-init 这个就是会安装全局的vue3.0版本.安装好之后我们也可以vue -V查看当前vu ...
- 快速ni
代码: while(p>0) (mul(a,b)) = a*b; { 等同于二分 if(p%2==1) mul(ans,a); 目的是为了二分个基数的二次方乘 ...
- Window逆向基础之逆向工程介绍
逆向工程 以设计方法学为指导,以现代设计理论.方法.技术为基础,运用各种专业人员的工程设计经验.知识和创新思维,对已有产品进行解剖.深化和再创造. 逆向工程不仅仅在计算机行业.各行各业都存在逆向工程. ...