2、两数相加

2024-06-18 04:52
文章标签 相加

本文主要是介绍2、两数相加,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、问题如下

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

2、思路解析

 在草稿纸上画一画思路还是比较清晰的。第一遍写的时候主要有如下问题:

(1)如何生成全新链表的问题。更准确来说怎么返回链表头。关于这个问题有标准的处理方法:

#定义一个cur指针,后续迭代指针用的都是cur;
#另外定义一个用于返回的root指针,初值就赋予cur;但是最终我们返回的时候返回的是 root->next。
#因为 cur->next 是链表头的首个元素,这也算是通用玩法了。ListNode* cur = new ListNode(0);ListNode* root = p_cur;

(2)另外就是考虑几种特殊情况。例如可能进位的问题、例如链表遍历完毕后如果有进位需要在while循环结束后补一个节点。

 

另外,对着图思路还是比较清晰的,程序代码如下。

#include <iostream>
#include <string>using namespace std;struct ListNode{int val;ListNode* next;ListNode(): val(0), next(nullptr){}ListNode(int v): val(v), next(nullptr){}ListNode(int v, ListNode* n): val(v), next(n){}
};/*
class ListNode{public:int val;ListNode* next;ListNode();ListNode(int v);ListNode(int v, ListNode* n);
};ListNode::ListNode()
{val = 0;next = nullptr;
}ListNode::ListNode(int v){val = v;next = nullptr;
}ListNode::ListNode(int v, ListNode* n){val = v;next = n;
}
*/void print_list(ListNode * l1){ListNode *head = l1;while(head != nullptr){cout << head->val << " ";head = head->next;}cout << endl;
}ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{//ListNode* p_cur(0); //脑子有问题,这些写是个狗屁意思ListNode* p_cur = new ListNode(0);ListNode* lr = p_cur;int add_num = 0; //同位求和数值int gewei = 0;  //记录求和之后的个位数值int shiwei = 0; //记录求和之后的十位数值while(l1 != nullptr || l2 != nullptr){if (l1 != nullptr && l2 != nullptr){add_num = l1->val + l2->val + shiwei;gewei = add_num % 10;shiwei = add_num / 10;p_cur->next = new ListNode(gewei);;l1 = l1->next;l2 = l2->next;p_cur = p_cur->next;//print_list(lr->next);}if (l1 == nullptr && l2 != nullptr){ add_num = l2->val + shiwei;gewei = add_num % 10;shiwei = add_num / 10;p_cur->next = new ListNode(gewei);l2 = l2->next;p_cur = p_cur->next;//print_list(lr->next);}if (l2 == nullptr && l1 != nullptr){add_num = l1->val + shiwei;gewei = add_num % 10;shiwei = add_num /10;p_cur->next = new ListNode(gewei);l1 = l1->next;p_cur = p_cur->next;//print_list(lr->next);}}if (shiwei != 0){p_cur->next = new ListNode(shiwei);}return lr->next;
}int main()
{/*ListNode n11(2);ListNode n12(4);ListNode n13(3);n11.next = &n12;n12.next = &n13;print_list(&n11);ListNode n21(5);ListNode n22(6);ListNode n23(4);n21.next = &n22;n22.next = &n23;print_list(&n21);
*/
/*ListNode n11(9);ListNode n12(9);ListNode n13(9);ListNode n14(9);ListNode n15(9);ListNode n16(9);ListNode n17(9);n11.next = &n12;n12.next = &n13;n13.next = &n14;n14.next = &n15;n15.next = &n16;n16.next = &n17;print_list(&n11);ListNode n21(9);ListNode n22(9);ListNode n23(9);ListNode n24(9);n21.next = &n22;n22.next = &n23;n23.next = &n24;
*/ListNode n11(0);ListNode n21(0);ListNode* result = addTwoNumbers(&n11, &n21);print_list(result);}

 

3、反思

期间犯了一个十分神奇的错误。脑子抽风了。

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)

{

        //ListNode* p_cur(0); //脑子有问题,这些写是个狗屁意思

        ListNode* p_cur = new ListNode(0);

        ListNode* lr = p_cur;

        int add_num = 0; //同位求和数值

我们要的是 ListNode 类型的指针 p_cur。

可以这样写:

        ListNode cur(0);

        ListNode* p_cur = &cur;

也可以这样写:

        ListNode* p_cur = new ListNode(0);

明显 “ListNode* p_cur(0);” 啥也不是。脑子抽风了,否则怎么会写出这行代码。

这篇关于2、两数相加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071346

相关文章

javaScript日期相加减例子

当前时间加上2天 var d = new Date(“2015-7-31”); d.setDate(d.getDate()+2); var addTwo=d.getFullYear()+”年”+(d.getMonth()+1)+”月”+d.getDate()+”日”; “控制台输出===============”+”当前日期加2天:”+addTwo; 使用这种方法,月份也会给你计算.

两个长数字相加

1.编程题目 题目:要实现两个百位长的数字直接相加 分析:因为数字太长所以无法直接相加,所以采用按位相加,然后组装的方式。(注意进位) 2.编程实现 package com.sino.daily.code_2019_6_29;import org.apache.commons.lang3.StringUtils;/*** create by 2019-06-29 19:03** @autho

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

链表(篇5)用链表实现多项式相加

使用链接实现两个多项式相加 例: 输入:第一数= 5x ^ 2 + 4x ^ 1 + 2x ^ 0第二数= 5x ^ 1 + 5x ^ 0输出:5x ^ 2 + 9x ^ 1 + 7x ^ 0输入:第一数= 5x ^ 3 + 4x ^ 2 + 2x ^ 0第二数= 5x ^ 1 + 5x ^ 0输出:5x ^ 3 + 4x ^ 2 + 5x ^ 1 + 7x ^ 0 代码

算法------四数相加 II (java 版本)

题目: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。例如:输入:A = [

vector所有元素相加求和_利用accumulate函数

自己使用时的两行代码 #include<numeric> //使用accumulate函数要包含这个头文件vector<float> result = {1.2, 2.3, 3.4};float scoreSum = accumulate(result.begin(), result.end(), 0.0); 然后看一下http://www.cplusplus.com/reference/

力扣top300——2.两数相加

序号前300中非会员题 2. 两数相加 我们建立一个哨兵,方便返回使用,再建立一个指针cur,来一个个建立链表。 循环遍历链表,当两个链表没走到头或需要进位时继续下去。 当前结点的值为进位+两链表值%10,然后修改进位,将结果放入链表,将3个链表走到next /*** Definition for singly-linked list.* struct ListNode {* i

Leetcode 445. 两数相加 II ----python

1. 题目描述 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 示例: 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 8 -> 0 -> 7 2. 解题思路 此题若不逆置初始链表,可以用栈来存储链表的值,

面试题七 C/C++ 两个字符串由数字组成的相加,最大不超过32bit整形的系统函数--程序员面试题

面试题: 给定两个由0-9数字组成的最长可到30个字符的字符串,请计算他们对应的整数和。允许使用字符串 转最大不超过32bit整形的系统函数。 当我看到这个面试题的时候,貌似不是第一次,所以就动手写了写。欢迎在下面留言写其他方法。也可以加入QQ群聊:83459374 好了不多说,请看代码: void calculateAdd() { string str1 = "21

代码随想录算法训练营第六天|454.四数相加II;383. 赎金信;15. 三数之和;18. 四数之和

今日任务 ●  454.四数相加II ●  383. 赎金信 ●  15. 三数之和 ●  18. 四数之和 详细布置 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。 题目链接:. - 力扣(LeetCode) 题目链接/文