leetcode2 Add Two Numbers题解

该博客主要解析LeetCode第2题,题目要求将两个逆序链表表示的数相加,返回相加后的逆序链表。初看易误解为正序链表,实际上需处理进位问题。博主分享了一版较繁琐的初始代码实现。
摘要由CSDN通过智能技术生成

题的大概意思就是,输入两个列表,这两个列表是两个逆序的数,比如说1->2->4就代表421.然后将两个链表翻转后相加,存入列表中,同样按照逆序存入列表,将其返回,刚开始题意理解错了,WA了两次,题目给出的一组数据比较具有迷惑性,就是243+564与432+465的结果都是807,所以刚开始我以为输入的两个链表的数正序的,只需将结果翻转就可以了.其实这道题和大整数相加差不太多,只要考虑一下进位就没什么问题了.\

第一版代码如下,比较繁琐,还有一些测试语句:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int Num1[1000],Num2[1000],Sum[1000],temp[1000];//分别存储l1,l2,l1+l2,翻转列表时使用
        int i,j;//循环变量
        int len1,len2,len;//分别存储len(l1),len(l2),max(len1,len2)
        int jinwei = 1;//进位的标志位

        memset(Num1,-1,sizeof(Num1));
        memset(Num2,-1,sizeof(Num2));
        memset(Sum,-1,sizeof(Sum));
        memset(temp,-1,sizeof(temp));
        
        for (i = 1;; i++)//将l1转化为数组Num1
        {
            temp[i] = l1->val;
            if (l1->next == NULL)
            {
                break;
            }
            l1 = l1->next;
        }
        len1 = i;
        for (i = 1; i<=len1; i++)
        {
            Num1[i] = temp[len1-i+1];
           // printf("Num1:%d\n",Num1[i]);
        }
        
        memset(temp,-1,sizeof(temp));

        for (i = 1;; i++)//将l2转化为数组Num2
        {
            temp[i] = l2->val;
            if (l2->next == NULL)
            {
                break;
            }
            l2 = l2->next;
        }
        len2 = i;
        for (i = 1; i<=len2; i++)
        {
            Num2[i] = temp[len2-i+1];
           // printf("Num2:%d\n",Num2[i]);
        }


        if (len2<=len1)//根据长度,将长度短的加到长度长的上面,将Num1与Num2按位相加
        {
            len = len1;
            j = len1;
            for (i = 1; i<=len1; i++)
            {
                Sum[i] = Num1[i];
            }
            for (i = len2; i>0; i--,j--)
            {
                Sum[j] = Sum[j] + Num2[i];
            }
        }
        else
        {
            len = len2;
            j = len2;
            for (i = 1; i<=len2; i++)
            {
                Sum[i] = Num2[i];
            }
            for (i = len1; i>0; i--,j--)
            {
                Sum[j] = Sum[j] + Num1[i];
            }
        }

        /*for (i = 0; i<=len; i++)
        {
            printf("Sum:%d\n",Sum[i]);
        }*/

        for(i=len;i>0;i--)//处理一下Sum的进位问题
        {
            if(Sum[i-1] == -1&&(Sum[i]/10))
            {
                Sum[i-1]++;
                jinwei = 0;
            }

            Sum[i-1] += (Sum[i]/10);
            Sum[i] %= 10;
        }

        /*for (i = 0; i<=len; i++)
        {
            printf("Sum:%d\n",Sum[i]);
        }*/

        ListNode head(0);
        ListNode *pre = &head;

        for(i=len;i>=jinwei;i--)//将Sum数组转化为链表
        {
            pre->next = new ListNode(Sum[i]);
            pre = pre->next;
        }
        /*
        while(1)
        {
            printf("result:%d\n",head.next->val);
            if (head.next->next == NULL)
        {
            break;
        }
            head.next = head.next->next;
        }*/

        return head.next;
        
    }
};



int main()
{

	/*
	ListNode list1(1);
	ListNode* p = &list1;
	p->next = new ListNode(8);
	p = p->next;
	p->next = new ListNode(4);
	p = p->next;
	p->next = new ListNode(7);
	p = p->next;
    */
	/*ListNode* test = &list1;
	while(1)
	{
		printf("%d",test->val);
		if (test->next == NULL)
		{
			break;
		}
		test = test->next;
	}*/
    ListNode list1(5);
    ListNode* p = &list1;
    p->next = new ListNode(8);

	ListNode list2(5);

	Solution tt;
	ListNode *result = tt.addTwoNumbers(&list1,&list2);
	/*while(1)
	{
		printf("%d",result->val);
		if (result->next == NULL)
		{
			break;
		}
		result = result->next;
	}*/

	return 0;
}

最终版,简化之后:

class Solution {
public:
    void append(ListNode* l3, int num) {
        ListNode *end = new ListNode(num);
        l3->next = end;
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry = 0;
        ListNode *l3 = new ListNode(0);
        ListNode *pl3 = l3;
        int a, b, c;//
        while (l1 || l2 || carry) {
            if (l1) a = l1->val;
            else    a = 0;
            if (l2) b = l2->val;
            else    b = 0;
            c = (a + b + carry) % 10;//直接逆序计算序列,存入取余之后iude
            append(pl3, c); //将c存入链表中
            pl3 = pl3->next;
            carry = (a + b + carry) / 10;//将进位存在carry中
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;

        }
        ListNode *ret = l3->next;
        delete l3;
        return ret;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值