Leetcode:2. 两数相加

题目描述:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

示例:

输入:(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;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
12         if(l1 == nullptr || l2 == nullptr)
13             return nullptr;
14         ListNode* head = new ListNode(0);
15         ListNode* res = head;
16         int plusone = 0;
17         while(l1!=nullptr && l2!=nullptr)
18         {
19             int sum = l1->val + l2->val + plusone;
20             plusone = 0;
21             if(sum >= 10)
22             {
23                 plusone = sum/10;
24             }
25             res->next = new ListNode(sum % 10);
26             res = res->next;
27             l1 = l1->next;
28             l2 = l2->next;
29         }
30         while(l1 != nullptr)
31         {
32             int sum = l1->val + plusone;
33             plusone = 0;
34             if(sum >= 10)
35             {
36                 plusone = sum/10;
37             }
38             res->next = new ListNode(sum % 10);
39             res = res->next;
40             l1 = l1->next;
41         }
42          while(l2 != nullptr)
43         {
44             int sum = l2->val + plusone;
45             plusone = 0;
46             if(sum >= 10)
47             {
48                 plusone = sum/10;
49             }
50             res->next = new ListNode(sum % 10);
51             res = res->next;
52             l2 = l2->next;
53         }
54         if(plusone)
55         {
56             res->next = new ListNode(plusone);
57             res = res->next;
58         }
59         return head->next;
60     }
61 };
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
12         if(l1 == nullptr || l2 == nullptr)
13             return nullptr;
14         ListNode* head = new ListNode(0);
15         ListNode* res = head;
16         int plusone = 0;
17         while(l1!=nullptr || l2!=nullptr)
18         {
19             int a = (l1==nullptr ? 0 : l1->val);
20             int b = (l2==nullptr ? 0 : l2->val);
21             int sum = a + b + plusone;
22             plusone = 0;
23             if(sum >= 10)
24             {
25                 plusone = sum/10;
26             }
27             res->next = new ListNode(sum % 10);
28             res = res->next;
29             if(l1!=nullptr)
30                 l1 = l1->next;
31             if(l2!=nullptr)
32                 l2 = l2->next;
33         }
34
35         if(plusone)
36         {
37             res->next = new ListNode(plusone);
38             res = res->next;
39         }
40         return head->next;
41     }
42 };

原文地址:https://www.cnblogs.com/LJ-LJ/p/11105772.html

时间: 2024-10-07 23:59:28

Leetcode:2. 两数相加的相关文章

Leetcode 002.两数相加

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

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 2 两数相加 考虑溢出

先用int存了结果然后出错,int溢出了. 真是憨批嗷. 不用考虑保存结果,直接一位一位计算就行. 感觉被描述误导了. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(L