Leetcode 002.两数相加

1.题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

2.易理解版本

2.1 解题思路

题中链表顺序正好是低位到高位,先低位相加,有进位保持,下一位计算加上进位,直到最高位相加,如果有进位,生成新的结点保存。

2.2 我的代码

//两数相加
//没有创建全新的链表,使用L1、L2中较长的保存结果
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

        unsigned int count1 = 0, count2 = 0;//统计两个链表长度
        unsigned int carry = 0; //进位

        while (l1 != NULL && l2 != NULL)
        {
            l1->val = (l1->val + l2->val + carry) % 10;
            l2->val = (l1->val + l2->val + carry) % 10;

            //判断有无进位
            if ((l1->val + l2->val + carry) / 10 != 0)
                carry = 1;
            else
                carry = 0;

            // ((l1->val + l2->val + carry) / 10 != 0)?carry = 1 : carry = 0 ;

            l1 = l1->next;
            l2 = l2->next;
        }

        if (l1 != NULL)
        {   //L1更长,剩余链表处理
            while (l1 != NULL)
            {
                l1->val = (l1->val + carry) % 10;
                if ((l1->val + carry) / 10 != 0)
                    carry = 1;
                else
                    carry = 0;
                l1 = l1->next;
            }
            if (l1 == NULL && carry == 1)
                ListNode(1);
            return l1;
        }
        else
        {   //L2更长,剩余链表处理
            while (l2 != NULL)
            {
                l2->val = (l2->val + carry) % 10;
                if ((l2->val + carry) / 10 != 0)
                    carry = 1;
                else
                    carry = 0;
                l2 = l2->next;
            }
            if (l2 == NULL && carry == 1)
                ListNode(1);
            return l2;
        }

    }
};

3.简洁版本

class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode *res = new ListNode(-1);//存储结果
        ListNode *cur = res;
        int carry = 0;
        while (l1 || l2) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur->next;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
        }
        if (carry) cur->next = new ListNode(1);
        return res->next;
    }
};//潜在问题:memory leak, ListNode *res = new ListNode(-1);没有最后释放。

4.用时更少的范例

//来源:Leetcode官网提交的答案/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

//优化C++I/O提速
static const auto __ = []() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  return nullptr;
}();

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* L_result = new ListNode(0);
        ListNode* a = l1;
        ListNode* b = l2;
        ListNode*cur = L_result;
        int carry = 0;
        while(a != NULL || b != NULL)
        {
            int val1 = a != NULL ? a->val : 0;
            int val2 = b != NULL ? b->val : 0;
            int sum = val1 + val2 + carry;
            carry = bool(sum / 10);
            cur->next = new ListNode(sum %10);

            //先判是否为空,再赋值
            if(a != NULL)
            {
                a = a->next;
            }
            if(b != NULL)
            {
                b = b->next;
            }
            cur = cur->next;
        }
        if(carry)
        {
           cur->next = new ListNode(1);
        }
        return L_result->next;

    }
};

参考资料:

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

原文地址:https://www.cnblogs.com/paulprayer/p/10029750.html

时间: 2024-08-29 22:26:42

Leetcode 002.两数相加的相关文章

LeetCode之 两数相加

本内容为LeetCode第二道题目:两数相加 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 10:47:12 2019 @author: Administrator 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头

LeetCode 445. 两数相加 II(Add Two Numbers II)

445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转. LeetCode445. Add Two Numbers II中等 示例: 输入: (7 -> 2 -> 4 -> 3) + (5 ->

leetcode 2. 两数相加

给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val

leetcode T2 两数相加详解

两数相加 题目描述 给出两个?非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照?逆序?的方式存储的,并且它们的每个节点只能存储?一位?数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和.您可以假设除了数字 0 之外,这两个数都不会以 0?开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 详细题解 加法模拟,使用变量carry来跟踪进位,并

LeetCode 445 两数相加 II

链接:https://leetcode-cn.com/problems/add-two-numbers-ii 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转. 示例: 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出: 7 -&g

LeetCode的两数相加

给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 来源:力扣(LeetCode) 链接:https://leetcod

力扣(LeetCode)两数相加 个人题解

给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 题目是比较基础的,题意也十分清晰,可以模拟人工手算的方式达成,但是要

Python版[leetcode]2. 两数相加(难度中等)

给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807 # Definition for singly-linked list.

leetcode 002 两个数相加

题目: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 numb