给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
这两个数字都不会以零开头。
示例
输入: (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中调用栈机制