刷题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;
} 

原文地址:https://www.cnblogs.com/siweihz/p/12229784.html

时间: 2024-08-30 10:00:22

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

LeetCode第四题,Add Two Numbers

题目原文: You are given two linked lists representing two non-negative numbers. 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. Input: (2 -> 4 -> 3) + (5 -> 6

【LeetCode刷题系列 - 002题】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 num

LeetCode第二题: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

LeetCode刷题笔录Add Binary

Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". 具体一位一位地加就行了,考虑进位的问题.还有最后记得把生成的string反过来再返回,因为我们是从最低位开始加的. public class Solution { public String addBinary(String a

【leetcode刷题笔记】Add Two Numbers

You are given two linked lists representing two non-negative numbers. 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. Input: (2 -> 4 -> 3) + (5 -> 6 ->

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

由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的目标是一周最少两道,可能会多做多想,工作再忙也会完成这个最低目标. Two sum: Given an array of integers, return indices of the two numbers such that they add up to a specific target. Y

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

【leetcode刷题笔记】Add Binary

Given two binary strings, return their sum (also a binary string). For example,a = "11"b = "1"Return "100". 题解:简单的二进制加法模拟.a,b的最后以为对齐开始进行加法,用carries保存进位,如果加完后最高位还有进位,那么要在结果的最前面加一个1. 代码如下: 1 public class Solution { 2 public Str

leetcode_2_题——Add Two Numbers(链表)

Add Two Numbers Total Accepted: 58510 Total Submissions: 268082My Submissions Question Solution You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digi