description:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
solution:
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
typedef struct ListNode {
int val;
struct ListNode *next;
}ListNode; //定义ListNode
typedef struct SqStack{ //定义顺序栈
struct ListNode *base; //基指针
struct ListNode *top; //顶指针
int stackSize; //顺序栈的大小
}SqStack;
SqStack* InitStack(SqStack *s){ //初始化顺序栈
s=(SqStack *)malloc(sizeof(SqStack));
if(!s){
exit(0);
}
else{
s->base=(ListNode *)malloc(STACK_INIT_SIZE*sizeof(ListNode));
s->top=s->base;
s->stackSize=STACK_INIT_SIZE;
}
return s;
}
int FreeStack(SqStack *s){ //释放顺序栈
if(!s){
printf("Stack is null no need to free!\n");
return 0;
}
else{
free(s->base);
free(s);
return 1;
}
}
int PushStack(SqStack *s,ListNode e){ //元素e入栈1
if(s->top-s->base>=s->stackSize){
s->base=(ListNode *)realloc(s->base,(s->stackSize + STACK_INCREMENT)*sizeof(ListNode));
if(!s->base){
printf("realloc failed!\n");
exit(1);
}
s->top=s->base+s->stackSize;
s->stackSize+=STACK_INCREMENT;
}
else{
*(s->top)=e;
++(s->top);
}
return 1;
}
int PopStack(SqStack *s,ListNode *e){
if(s->base==s->top){
//printf("It's a empty stack\n");
return 0;
}
*e=*(--s->top);
return 1;
}
void print(SqStack *s){
ListNode *elem = s->base;
if(s->base == s->top){
printf("This is an empty stack!\n");
}
for(elem ; elem != s->top ; elem++){
printf("element is %d", *elem);
printf("\n");
}
}
int GetTop(SqStack *s,ListNode *e){
if(s->base==s->top){
printf("It's a empty stack\n");
return 0;
}
*e=*(s->top-1);
return 1;
}
ListNode* addTwoNumbers(ListNode* l1,ListNode* l2) {
SqStack *s;
s = InitStack(s);
ListNode *p1=l1->next; //p1为第一个节点
ListNode *p2=l2->next; //p2为第二个节点
ListNode *h1=(ListNode *)malloc(sizeof(ListNode)); //新链表h1
ListNode *h2=(ListNode *)malloc(sizeof(ListNode)); //新链表h2
for(;p1!=NULL;p1=p1->next){ //遍历表1
PushStack(s,*p1); //将元素p1压入栈
}
ListNode *q1=(ListNode *)malloc(sizeof(ListNode)); //链表1出栈元素q1
ListNode *t1=(ListNode *)malloc(sizeof(ListNode));
PopStack(s,q1);
printf("q1 val=%d \n",q1->val);
ListNode *temp=(ListNode *)malloc(sizeof(ListNode)); //第一个节点
temp->val=q1->val;
temp->next=NULL;
h1->next=temp;
t1=temp;
while(PopStack(s,q1)>0){ //地址不变
ListNode *temp1=(ListNode *)malloc(sizeof(ListNode)); //第二个节点
printf("q1 val=%d \n",q1->val);
temp1->val=q1->val;
temp1->next=NULL;
t1->next=temp1;
t1=temp1;
} //odo
for(;p2!=NULL;p2=p2->next){ //遍历表2
PushStack(s,*p2); //将元素p2压入栈
}
ListNode *q2=(ListNode *)malloc(sizeof(ListNode)); //链表2出栈元素q2
ListNode *t2=(ListNode *)malloc(sizeof(ListNode));
PopStack(s,q2);
printf("q2 val=%d \n",q2->val);
ListNode *temp2=(ListNode *)malloc(sizeof(ListNode));
temp2->val=q2->val;
temp2->next=NULL;
h2->next=temp2;
t2=temp2;
while(PopStack(s,q2)>0){
ListNode *temp3=(ListNode *)malloc(sizeof(ListNode)); //第二个节点
printf("q2 val=%d \n",q2->val);
temp3->val=q2->val;
temp3->next=NULL;
t2->next=temp3;
t2=temp3;
}
ListNode *ptr1=(ListNode *)malloc(sizeof(ListNode));
ptr1=h1->next;
ListNode *ptr2=(ListNode *)malloc(sizeof(ListNode));
ptr2=h2->next;
ListNode *h3=(ListNode *)malloc(sizeof(ListNode));
ListNode *p3=(ListNode *)malloc(sizeof(ListNode));
ListNode *q3=(ListNode *)malloc(sizeof(ListNode));
h3->next=p3;
q3=p3; //保留前一个节点地址
int flag=0; //进位
for(;ptr1!=NULL&&ptr2!=NULL;){
if(ptr1->val+ptr2->val+flag>=10){
p3->val=ptr1->val+ptr2->val+flag-10;
flag=1;
}
else{
p3->val=ptr1->val+ptr2->val+flag;
flag=0;
}
if(ptr1->next==NULL&&ptr2->next==NULL){ //条件为什么能通过
p3->next=NULL;
}
else{
p3=(ListNode *)malloc(sizeof(ListNode));
q3->next=p3;
q3=p3;
}
ptr1=ptr1->next;
ptr2=ptr2->next;
}
printf("h3 next val=%d \n",h3->next->val);
printf("h3 next next val=%d \n",h3->next->next->val);
printf("h3 next next next val=%d \n",h3->next->next->next->val);
FreeStack(s);
return h3;
}
int main(){
ListNode *h1=(ListNode *)malloc(sizeof(ListNode));
ListNode *e1=(ListNode *)malloc(sizeof(ListNode));
e1->val=2;
ListNode *e2=(ListNode *)malloc(sizeof(ListNode));
e2->val=4;
ListNode *e3=(ListNode *)malloc(sizeof(ListNode));
e3->val=3;
h1->next=e1;
e1->next=e2;
e2->next=e3;
e3->next=NULL;
ListNode *h2=(ListNode *)malloc(sizeof(ListNode));
ListNode *e4=(ListNode *)malloc(sizeof(ListNode));
e4->val=5;
ListNode *e5=(ListNode *)malloc(sizeof(ListNode));
e5->val=6;
ListNode *e6=(ListNode *)malloc(sizeof(ListNode));
e6->val=4;
h2->next=e4;
e4->next=e5;
e5->next=e6;
e6->next=NULL;
ListNode *h3=(ListNode *)malloc(sizeof(ListNode));
ListNode *e7=(ListNode *)malloc(sizeof(ListNode));
h3=addTwoNumbers(h1,h2);
e7=h3->next;
for(;e7!=NULL;e7=e7->next){
printf("h3 val=%d \n",e7->val);
}
return 0;
}
summary:
(1)解决思路利用顺序栈的特性(先进后出)对两个链表h1与h2进行倒置,得到h1'和h2',根据h1'和h2'对应节点运算得到目标链表h3对应节点,当h3构建完则任务完成.
(2)知识点:链表的构建,顺序栈的构建,
(3)debug:构建链表的节点需每次申请。