首页 > 其他分享 >Leetcode 2. 两数相加

Leetcode 2. 两数相加

时间:2023-04-12 23:23:16浏览次数:35  
标签:ListNode val int 相加 next l2 l1 Leetcode

这道题让我想起了acwing里的高精度加法,因为这里的加法也是超过100位了。于是套着模板写了一下,然后看了一下评论区,发现链表再套vector属于是脱裤子放屁了

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
 #include <vector>
class Solution {
public:

    vector<int> add(vector<int> &a, vector<int> &b){
        int t = 0;
        vector<int> c;
        for(int i = 0; i < a.size() || i < b.size(); i ++ ){
            if(i < a.size()) t += a[i];
            if(i < b.size()) t += b[i];
            c.push_back(t % 10);
            t /= 10;
        }
        if(t) c.push_back(1);
        return c;
    }

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        vector<int> A, B;
        while(l1 != nullptr){
            A.push_back(l1->val);
            l1 = l1->next;
        }
        while(l2 != nullptr){
            B.push_back(l2->val);
            l2 = l2->next;
        }
        
        vector<int> c;
        c = add(A, B);

        ListNode *l3 = new ListNode(c[0]);
        ListNode *res = l3;
        int len = c.size();
        for(int i = 1; i < len; i ++ ){
            
            ListNode *next1 = new ListNode(c[i]);
            l3->next = next1;
            l3 = next1;
        }

        return res;
    }
};

直接在链表的基础上做,注意和vector不太一样的是,每次加法的循环都要特别注意边界条件,注意两链表指针的更新。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int t = 0;//存储每一位相加的信息
        
        ListNode *l3 = new ListNode(-1);
        ListNode *res = l3;

        while(l1 != nullptr || l2 != nullptr){
            if(l1 != nullptr){ 
                t += l1->val;
                l1 = l1->next;
            }
            if(l2 != nullptr) {
                t += l2->val;
                l2 = l2->next;
            }
            l3->next = new ListNode(t % 10);
            t /= 10;
            l3 = l3->next;
        }

        if(t) l3->next = new ListNode(1);//如果最后最高位有进位,还得补一个1
        return res->next;
    }
};

 

 

  

标签:ListNode,val,int,相加,next,l2,l1,Leetcode
From: https://www.cnblogs.com/luxiayuai/p/17311854.html

相关文章

  • [C++]LeetCode1147. 段式回文
    [C++]LeetCode1147.段式回文题目描述Difficulty:困难RelatedTopics:贪心,双指针,字符串,动态规划,哈希函数,滚动哈希你会得到一个字符串text。你应该把它分成k个子字符串(subtext1,subtext2,…,subtextk),要求满足:subtexti是非空字符串所有子字符串的连接......
  • Rabin-Karp-leetcode187
    DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。例如, "ACGAATTCCG" 是一个 DNA序列 。在研究 DNA 时,识别DNA中的重复序列非常有用。给定一个表示 DNA序列 的字符串 s ,返回所有在DNA分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 ......
  • LeetCode 450.删除二叉搜索树的结点
    1.题目:给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例1:输入:root=[5,3,6,2,4,null,......
  • leetcode 185
    部门工资前三高的所有员工 selectd.nameasDepartment,e.nameasEmployee,e.salaryasSalaryfromEmployeeeleftjoinDepartmentdone.departmentId=d.Idwhere2>=(selectcount(distincte1.salary)fromEmployeee1wheree.salary<e1.salary......
  • LeetCode #448 找到所有数组中消失的数字
    基本思路为了满足题目要求的不使用额外的存储空间(当然返回的数组除外),并且时间复杂度控制在O(n),最多只能常数级别遍历,因此考虑将原数组视作一个"哈希表"。遍历原数组,将【1,n】上的值域映射到【0,n-】的坐标上,某个数x扫描到一次则将这个数x映射的x-1的坐标处的值加上n。......
  • LeetCode #283 移动零(双指针版本,效率高)
    基本思路思路————双指针初始状态左右指针都指向数组首位元素,然后right指针开始迭代数组,当碰到非0元素则与左指针left所在位置的元素交换。交换完毕后,左指针left则向前移动到下一位置,做好准备迎接下一个非0元素的交换。这种算法效率比之前撰写的“伪双指针”......
  • LeetCode #414 第三大的数
    解题思路数组从大到小排序后,从第2个元素开始遍历,如果与上一个元素不相同,则标志位++,标志位一旦从1加到3(两次)则代表存在第三大的数,即可返回。如若不存在第三大的数,则在遍历结束后,函数末尾返回数组的第一个元素(最大的元素)。标程1classSolution{2public:3intthirdMa......
  • LeetCode #485 最大连续 1 的个数
    解题思路基础题,最后加一个特殊情况处理就好,时间复杂度O(n)代码  classSolution{public:intfindMaxConsecutiveOnes(vector<int>&nums){intcount=0;intMaxcount=0;for(inti=0;i<nums.size();i++){if(nums[i]==1){......
  • #yyds干货盘点# LeetCode面试题:矩阵置零
    1.简述:给定一个 mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。 示例1:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]......
  • 4月11日leetcode练习
    设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素。 来源:力扣(Le......