首页 > 编程语言 >leetcode 算法题目学习笔记 - 序号2

leetcode 算法题目学习笔记 - 序号2

时间:2024-09-22 19:24:15浏览次数:7  
标签:ListNode int ptr next 算法 l2 l1 序号 leetcode

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

可用的模板
#include<iostream>
#include<cmath>

// #define A 7
// #define B 4
// int a[A]={9,9,9,9,9,9,9};
// int b[B]={9,9,9,9};

#define A 7
#define B 1
int a[A]={9,9,9,9,9,9,8};
int b[B]={1};

// #define A 3
// #define B 3
// int a[A]={2,4,3};
// int b[B]={5,6,4};

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) {}
  };


    ListNode* taverse(ListNode *&link){
        ListNode* a = link;
        for (int i = 0;a != nullptr; i++)
        {
            std::cout<<a->val<<" ";
            if(a->next)
                a = a->next;
            else break;
        }
        std::cout<<"\n";
        return a;
        
    }




    ListNode* createlist(int*array, const int& border){
        ListNode* ptr = new ListNode(-1);
        ListNode* head = ptr;
        for (int i = 0; i < border; i++) {

                ptr->val = array[i];
                if(i < border-1){

                    ptr->next = new ListNode;
                    ptr = ptr->next;
                
                }
        }
        return head;
    }
//-----------
     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  return nullntr}
//-----------

int main(){
    // ListNode* l1 = new ListNode(2,new ListNode(4,new ListNode(3,nullptr)));
    // ListNode* l2 = new ListNode(5,new ListNode(6,new ListNode(4,nullptr)));
    ListNode* l1 = createlist(a,A);
    ListNode* l2 = createlist(b,B);
    taverse(l1);
    taverse(l2);
    ListNode* result = addTwoNumbers(l1,l2);
    std::cout<<std::endl;
    taverse(result);
}


初始想法

暴力求解,将两个链表里面的数拿出来变成完整数字,求和,再转换为链表倒序存储

点击查看代码
class Solution {
public:
                int turnNumToDigits(long int num, int index){
        int digits{0};
        long long int buffer = num;
        for (int i = 0; i<index ; i++)
        {
            digits = buffer % 10;
            buffer/=10;
        }
        return digits;
    }

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        long long int first{0};
        long long int last{0};
        long long int solve{0};
        for (int i = 0; l1 != nullptr ;i++) {

            first += l1->val * pow(10, i);
            std::cout<<"Current First: "<<first<<"\n";
            l1=l1->next;


        }
        for (int i = 0;l2 != nullptr; i++) {

            last += l2->val * pow(10, i);
            std::cout<<"Current Last : "<<last<<"\n";
            l2=l2->next;

        }
        solve = first + last;
        std::cout<<"Current solve: "<<solve<<"\n";
        ListNode* ptr = new ListNode;
        long long int counts{solve};
        ListNode* result = ptr;
        for (int i = 0;; i++) {
            if ((counts/=10)<0.1){
                ptr->val = turnNumToDigits(solve,i+1);
                break;
            }
            else{
                ptr->next = new ListNode;
                ptr->val = turnNumToDigits(solve,i+1);
                ptr = ptr->next;
            }
            //counts++;
        std::cout<<counts<<"\n";
        }

        std::cout<<std::endl;
        return result;
    
    }
};

思路很简单 但是简单的令人发笑
因为题目的边缘case给到的最大数字可以达到100位
long long int都存不下
所以必须找到一个办法保证不会溢出,也就是说不能把整个数字都存下来。
或者按照大部分人给的优质解答,他们将两个链表一位一位对比,一个节点一个节点的求和,再把结果存到另一个链表中
中间如果发生进位,就把进位存下来,下一次求和的时候会加上.

点击查看代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head=new ListNode(-1);//存放结果的链表
        ListNode* h=head;//移动指针
        int sum=0;//每个位的加和结果
        bool carry=false;//进位标志
        while(l1!=NULL||l2!=NULL)
        {
            sum=0;
            if(l1!=NULL)
            {
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2!=NULL)
            {
                sum+=l2->val;
                l2=l2->next;
            }
            if(carry)
                sum++;
            h->next=new ListNode(sum%10);
            h=h->next;
            carry=sum>=10?true:false;
        }
        if(carry)
        {
            h->next=new ListNode(1);
        }
        return head->next;
    }
};
作者:陈乐乐
链接:https://leetcode.cn/problems/add-two-numbers/solutions/4375/liang-shu-xiang-jia-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

模仿这个思路:

点击查看代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* head = new ListNode(-1);
    ListNode* ptr  = head;
    bool t1{true},t2{true};
    bool carry = false;

    int counts{0};

    do{
        int sum{0};
        if(l1){
            sum+=l1->val;
            t1 = l1->next;
            l1 = l1->next;
        }
        if(l2){
            sum+=l2->val;
            t2 = l2->next;
            l2 = l2->next;
        }
        if(carry){ sum++;   carry = false; }
        if(sum>9){ sum-=10; carry = true ; }
        ptr->val=sum;
        if((t1||t2)||carry){
            ptr->next=new ListNode(-1);
        }
        if(ptr->next)
        ptr=ptr->next;
    }while(t1 || t2 || carry); 
    return head;
}
};

解题成功 效果不是很好 还可以进一步优化

标签:ListNode,int,ptr,next,算法,l2,l1,序号,leetcode
From: https://www.cnblogs.com/Brakeintime/p/18425415

相关文章

  • 关于 最短路 及其 拓展算法 的粗浅总结
    关于最短路及其拓展算法的粗浅总结最短路(Dijkstra)Core_Codeinlinevoiddijkstra(){memset(vis,0,sizeofvis); memset(dis,0x3f,sizeofdis);dis[s]=0;priority_queue<pair<int,int>>q;q.push(make_pair(dis[s],s));while(!q.empty()){......
  • 强化学习基础:主要算法框架与Python实现示例
    创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力!强化学习(ReinforcementLearning,RL)是一种通过与环境交互来学习策略的机器学习方法。RL主要包含以下几个关键组件:状态(State)、动作(Action)、奖励(Reward)、策略(Policy)和价值函数(ValueFunction)。常见的强化学习主流......
  • 药物分子生成算法综述:从生成对抗网络到变换器模型的多样化选择
    创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力!基于已有的药物数据生成新的药物分子是一项复杂的任务,通常涉及到生成模型和机器学习算法。以下是一些常用的算法和方法:1.生成对抗网络(GANs)特点:由生成器和判别器两个神经网络组成,生成器生成新分子,判别......
  • Day 20 回溯法part02| LeetCode 39. 组合总和 ,40.组合总和II,131.分割回文串
    39.组合总和39.组合总和classSolution{publicList<List<Integer>>res=newArrayList<>();publicList<Integer>path=newLinkedList<>();publicList<List<Integer>>combinationSum(int[]cand......
  • Day 21 回溯法part03| LeetCode 93. 复原 IP 地址,78.子集,90.子集II
    93.复原IP地址93.复原IP地址classSolution{List<String>res=newArrayList<>();publicList<String>restoreIpAddresses(Strings){backtracking(s,0,0);returnres;}voidbacktrack......
  • Tarjan算法及其应用 总结+详细讲解+详细代码注释
    \(\text{Tarjan}\)1.引入概念1.强连通分量1.定义在有向图\(G\)中,强连通分量就是满足以下条件的\(G\)的子图:从任意一点出发,都有到达另一个点的路径。不存在一个或者几个点,使得这个子图加入这些点后,这个子图还满足上一个性质。为什么要限定”在有向图中“而不是”在任......
  • 文心一言 VS 讯飞星火 VS chatgpt (352)-- 算法导论24.1 3题
    三、给定G=(V,E)是一带权重且没有权重为负值的环路的有向图,对于所有结点v∈V,从源结点s到结点v之间的最短路径中,包含边的条数的最大值为m。(这里,判断最短路径的根据是权重,不是边的条数。)请对算法BELLMAN-FORD进行简单修改,可以让其在m+1遍松弛操作之后终止,即使m不是......
  • C++速通LeetCode中等第10题-轮转数组(四种方法)
    方法一:巧用deque双向队列容器classSolution{public:voidrotate(vector<int>&nums,intk){deque<int>q;inttmp;if(nums.size()>1){for(autonum:nums)q.push_back(num);......
  • 【蓝桥杯】2024.9.22算法赛——灵魂问题\全栈项目小组(C++)
    一、灵魂问题题目灵魂问题题目分析1.要求输出一个整数2.题目在玩脑筋急转弯,关键句子标出来了——糖什么的根本不重要。所以咖啡不加糖,答案是0!!!代码#include<iostream>usingnamespacestd;intmain(){ cout<<0; return0;}二、全栈项目小组题目全栈项目小组......
  • 几种常用的算法(递归,Top-n)
    //C#用递归算法实现:一列数的规则如下:1、1、2、3、5、8、13、21、34,求第30位数是多少 publicstaticintGetPosValue(intpos) {    //第1位、第2位,实际上索引是0、1    if(pos==0||pos==1) //我们习惯上,位置使用索引(从0开始,0视为是第1位)    {   ......