力扣 445 两数相加

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

这两个数字都不会以零开头。
示例
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
因此本题的实现是用栈来实现的
c++中虽然提供了栈的直接调用,但是本题还是从最基础的栈实现,链表实现来编码的

#include <iostream>
using namespace std;
#define MaxSize 50
typedef struct LNode
{
    int data;
    struct LNode* next;
}LinkNode;
typedef struct SqStack
{
    int data[MaxSize];
    int top;
};
//栈的初始化
void Init_Stack(SqStack *&S)
{
    S = (SqStack*)malloc(sizeof(SqStack));
    S->top = -1;
}
//进栈操作
void Push(SqStack*&S,int& e )
{
    if (S->top == MaxSize - 1)//
        return;
    S->top++;
    S->data[S->top] = e;
}
//出栈操作
int Pop(SqStack* &S, int &e)
{
    if (S->top == - 1)//
        return 0;
    e = S->data[S->top];
    S->top--;
    return e;
}
//初始化链表
void InitList(LinkNode*& L)
{
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
}
//尾插法插入元素 为了让插入的元素正序
void Insert_R(LinkNode*& L, int a[], int n)
{
    LinkNode* R,* S;
    int i;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    R= L;
    for (i = 0; i < n; i++)
    {
        S = (LinkNode*)malloc(sizeof(LinkNode));
        S->data = a[i];
        R->next = S;
        R = S;
    }
    R->next = NULL;
}
//头插法
void CreateListF(LinkNode*& L, int a[], int n)
{
    LinkNode* s;
    int i;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
    for (i = 0; i < n; i++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));
        s->data = a[i];
        s->next = L->next; //s指向L的next
        L->next = s;
    }
}

//输出线性表
void DispList(LinkNode* L)
{
    LinkNode* s = L->next;
    while (s != NULL)
    {
            cout << s->data << "->";          
            s = s->next;
    }
}
int main()
{
    LinkNode* L1, * L2,*L3;
    SqStack* S1, * S2;
    int flag=0;
    int e,e1, e2;//用来接收栈弹出的元素
    int a[50] = {9,2,4,3};
    int b[50] = {8,6,4};
    int c[7] = {0};//用来为最后返回的链表传参
    int j=0;//让数组下标增长
    int count=0;//用来记录,链表有多少个数字
    int size;//记录c数组的长度变化
    Insert_R(L1, a, sizeof(a)/sizeof(a[0]));
    Insert_R(L2, b, sizeof(b) / sizeof(b[0]));
    Init_Stack(S1); //初始化栈  
    Init_Stack(S2);   
    do
    {
            Push(S1, L1->next->data);
            L1 = L1->next;               
    } while (L1->next->data != NULL);
    do
    {
        Push(S2, L2->next->data);
        L2 = L2->next;
    } while (L2->next->data != NULL);
    while (S1->top !=-1||S2->top !=-1)
    {
       e1= Pop(S1,e);
       flag += e1;
       e2=Pop(S2, e);
       flag += e2;
       c[j++] = flag % 10;
       flag = flag / 10;
    }
    if (flag == 1)//判断最后有没有进位
        c[j] = 1;
    CreateListF(L3, c, j + 1);//此时记录的元素是具体的元素,数组的最大下标得让j+1
    DispList(L3);
    return 0;
}

具体了解更简便的方法阅读下文
java中调用栈机制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值