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

LeetCode/2.两数相加

时间:2023-02-27 23:56:29浏览次数:40  
标签:ListNode int 相加 next 链表 l2 l1 LeetCode 两数

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

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

你可以假设除了数字 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
  • 题目数据保证列表表示的数字不含前导零

 

--------------------------------------------------------------------------------------

 

一开始将题目复杂化未找到一般规律,实际上倒叙的两数从头开始相加,可以直接从两个链表的每一位相加,直到长度长的链表取完数为止,短链表不足的位数直接视作0,相当于在纸上两个数相加运算,另外还需要注意一点即最后一位有进位需要在新链表末尾生成一个值为1的新节点,不要太草率。

 

/**
 * 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) {
        
        ListNode *head = NULL;
        ListNode *tail = NULL;
        int post = 0;        //post做进位标记(值)
        while(l1||l2){
        
        int add1 = l1 ? l1->val : 0;
        int add2 = l2 ? l2->val : 0;
        int nowvalue = add1+add2+post;  
        post = nowvalue/10;

        if(head == NULL)
        head = tail = new ListNode(nowvalue % 10);
        else
        {
            tail->next = new ListNode(nowvalue % 10);
            tail = tail ->next;
        }

        if(l1)
        l1 = l1->next;
        if(l2)
        l2 = l2->next;

        if(post!=0)   //不要忘记!
            tail->next = new ListNode(1);
        
        }

        


        
        return head;
    }
};

  

这应该不是最优解,还有进一步优化空间。

 

标签:ListNode,int,相加,next,链表,l2,l1,LeetCode,两数
From: https://www.cnblogs.com/konataxzy/p/17162418.html

相关文章

  • LeetCode算法训练 93.复原IP地址 78.子集 90.子集II
    欢迎关注个人公众号:爱喝可可牛奶LeetCode算法训练93.复原IP地址78.子集90.子集IILeetCode93.复原IP地址分析字符串全部由数字组成,ipv4每一段数字不能有前导0,且......
  • leetcode-1024-easy
    DivisorGameAliceandBobtaketurnsplayingagame,withAlicestartingfirst.Initially,thereisanumbernonthechalkboard.Oneachplayer'sturn,that......
  • leetcode-1037-easy
    ValidBoomerangGivenanarraypointswherepoints[i]=[xi,yi]representsapointontheX-Yplane,returntrueifthesepointsareaboomerang.Aboomerang......
  • 【LeetCode二叉树#10】从中序与后序遍历序列构造二叉树
    力扣题目链接(opensnewwindow)根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历inorder=[9,3,15,20,7]后序遍......
  • #yyds干货盘点# LeetCode面试题:串联所有单词的子串
    1.简述:给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串长度相同。 s 中的串联子串是指一个包含 words 中所有字符串以任意顺序排列连接起来的......
  • LeetCode 79. 单词搜索(/dfs)
    原题解题目约束题解classSolution{public:boolcheck(vector<vector<char>>&board,vector<vector<int>>&visited,inti,intj,string&s,intk)......
  • LeetCode 周赛 334,在算法的世界里反复横跳
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。今天是LeetCode第334场周赛,你参加了吗?这场周赛考察范围比较基础,整体难度......
  • LeetCode 78. 子集(/)
    原题解题目约束题解解法一classSolution{public:vector<int>t;vector<vector<int>>ans;vector<vector<int>>subsets(vector<int>&nums)......
  • #yyds干货盘点# LeetCode面试题:下一个排列
    1.简述:整数数组的一个排列 就是将其所有成员以序列或线性顺序排列。例如,arr=[1,2,3],以下这些都可以视作arr的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。整数数组的......
  • #yyds干货盘点# LeetCode面试题:最长有效括号
    1.简述:给你一个只包含'(' 和')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例1:输入:s="(()"输出:2解释:最长有效括号子串是"()"示例2:输入:s=")()())"......