您的位置:首页 > 其它

LeetCode 445 Add Two Numbers II(栈+链表)

2017-05-09 10:55 411 查看
You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers
and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:

What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7

题目大意:给出两个非空链表,求两个链表所代表的数字之和。

解题思路:遍历每个链表,将值存入两个栈中,然后对栈顶元素操作即可。

代码如下:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/

struct Node{
int val;
struct Node* next;
};
struct StackNode{
int size;
struct Node* top;
};
typedef struct StackNode* Stack;

void makeEmpty(Stack stk)
{
stk->size = 0;
stk->top = NULL;
}

Stack createStack()
{
Stack stk = malloc(sizeof(struct StackNode));
makeEmpty(stk);
return stk;
}

void push(Stack stk, int x)
{
struct Node* tmp = malloc(sizeof(struct Node));
tmp->next = NULL;
tmp->val = x;
if(stk->size == 0){
stk->top = tmp;
}else{
tmp->next = stk->top;
stk->top = tmp;
}
stk->size++;
}

void pop(Stack stk)
{
struct Node* tmp = stk->top;
stk->top = tmp->next;
stk->size--;
free(tmp);
}

int top(Stack stk)
{
if(stk && stk->top)
return stk->top->val;
return 0;
}

void destroyStack(Stack stk)
{
while(stk->size){
pop(stk);
}
free(stk);
}

void traverse(struct ListNode* list, Stack stk)
{
while(list){
push(stk, list->val);
list = list->next;
}
}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
Stack stk1 = createStack();
Stack stk2 = createStack();
Stack ans = createStack();

traverse(l1, stk1);
traverse(l2, stk2);

int sum = 0;
while(stk1->size || stk2->size){
if(stk1->size){
sum += top(stk1);
pop(stk1);
}
if(stk2->size){
sum += top(stk2);
pop(stk2);
}
push(ans, sum % 10);
sum /= 10;
}
if(sum) push(ans, sum);
destroyStack(stk1);
destroyStack(stk2);

return ans->top;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode