《LeetCode 》 ---- 两数相加 (一半样例)

Posted ×序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode 》 ---- 两数相加 (一半样例)相关的知识,希望对你有一定的参考价值。

此题选自 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:将链表的值分别取出,存到一个动态二维数组,逆置。转换成 long long int,两值相加,再求余,求出每一位,导入新链表并返回。

问题:long long int 只能有十位,当两值相加超过十位,long long int 此时会爆,故这种方法只能过 一半样例。

注:代码中 逆置(头插法) 此题并未用到。

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
struct node{
    int data;
    struct node *next;
};

void Init(struct node *L) //创建单链表
{
    int n;
    struct node *p;
    cin>>n;
    while(n!=-1)      // 当输入-1 停止
    {   p = new node;
        //cin>>p->data;
        p->data=n;
        p->next=NULL;

        L->next=p;
        L=L->next;
        cin>>n;
    }
}
void Inverse_set(struct node *L) //逆置
{
    struct node *q,*p;
    p = L; // p 指向 head
    p=L->next;
    L->next=NULL;
    //q = p; // 两指针指向第一个
    while(p)
    {
          q=p;
        p=p->next;
        /*头插*/
        q->next=L->next;
        L->next=q;

    }

}
struct node* addTwoNumbers(struct node *l1,struct node *l2){

    int *a,*b,*z,*h;
    a = (int*)malloc(100*sizeof(int));
    z =a;
    b = (int*)malloc(100*sizeof(int));
    h = b;
    struct node *p,*q;
    p = l1;
    int n1=0;
    while(p){
        *z = p->data;
        cout<<a[n1]<<\' \';
        z = z + 1;
        p=p->next;
        n1++;
    }
    cout<<"\\n";
    int i;
    for(i=0;i<n1/2;i++)
    {
        int temp = a[i];
        a[i] = a[n1-1-i];
        a[n1-1-i] = temp;
    }
    // 加和
    int sum = 0;
    for(i=0; i<n1; i++){
        sum = sum * 10 + a[i];
        }
        cout<<sum<<" \\n";
    long long int sum1 = sum;

    q=l2;
    int n2=0;
     while(q){
        *h = q->data;
        cout<<b[n2]<<\' \';
        h = h + 1;
        q=q->next;
        n2++;
    }
    cout<<"\\n";
    for(i=0;i<n2/2;i++)
    {
        int temp = b[i];
        b[i] = b[n2-1-i];
        b[n2-1-i] = temp;
    }
    // 加和
    sum = 0;
    for(i=0; i<n2; i++){
        sum = sum * 10 + b[i];
        }
        cout<<sum;

    sum = sum1+sum;
    if(sum==0)
            {p = (node*)malloc(sizeof(node));
            p->data=0;
            p->next=NULL;
            return p;
            }
    int k = sum;
    int n = 0;
    while(k)
    {
        k=k/10;
        n=n+1;
    }

     p = (node*)malloc(n*sizeof(node));
     struct node *x;
     x = p;

     k = sum;
     cout<<"\\nsum:"<<sum<<endl;
    x->data=k%10;
    x->next=NULL;
    k=k/10;
      while(n-1)      
    {   q = new node;
        q->data=k%10;
        q->next=NULL;
        k=k/10;
        x->next=q;
        x=x->next;
        n--;
    }
    return p;
}
void show(struct node *L) //输出单链表
{
    struct node *q;
    q = L;
    while(q)
    {
        cout<<q->data<<\' \';
        q = q->next;
    }
}
int main(){
    struct node *l1,*l2,*p,*q;
    l1 = new node;
    int k;
    cin>>k;
    l1->data = k;
    l1->next = NULL;
    Init(l1);
    l2 = new node;
    cin>>k;
    l2->data = k;
    l2->next = NULL;
    Init(l2);
    q = addTwoNumbers(l1,l2);
   cout<<"\\n\\n";
    show(q);
}

 

以上是关于《LeetCode 》 ---- 两数相加 (一半样例)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 2. 两数相加

LeetCode 2.两数相加

Leetcode 02: 两数相加(中等)

Leetcode两数相加

(链表专题) 445. 两数相加 II ——Leetcode每日一题

LeetCode 题号02: 两数相加