leetcode之Add Two Numbers

来源:互联网 发布:原油软件手机版 编辑:程序博客网 时间:2024/06/08 06:13
题目:

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


最初想着把第一个数放到一个整形数里,第二个数放到第二个数里,但不幸的是越界了,所以采用了该方法。

本例中遇到很多边界情况没有考虑到,所以调试了很久。


最初遇到的是动态开辟Struct问题。

ListNode *temp;

temp = new ListNode(0);

我现在还没有搞清楚为什么上面括号里面是0,只是知道要这样做。

以下源码

// test2AddTwoNumbers.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <string>
#include <iostream>
using std::string; using std::cin; using std::cout; using std::endl;


/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/


struct ListNode{
int val;
ListNode *next;
ListNode(int x) :val(x), next(NULL){}
};
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2);


int _tmain(int argc, _TCHAR* argv[])
{
ListNode *temp1;
ListNode *res;
ListNode *temp2;
ListNode *temp3;
ListNode *temp4;
temp1 = new ListNode(0);
temp1->val = 1;
temp1->next = NULL;
temp2 = new ListNode(0);
temp2->val = 9;
temp4 = temp2;
for (int i = 0; i <1; i++)
{
temp3 = new ListNode(0);
temp3->val =9;
temp3->next = NULL;
temp2->next = NULL;
temp2->next = temp3;
temp2 = temp2->next;
temp2->next = NULL;
}


res = addTwoNumbers(temp4, temp1);
return 0;
}


ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
int signal = 0;
int sum = 0;
ListNode *res;
ListNode *temp;
ListNode *temp1;
int i = 1, j = 1;
if (l1 == NULL)
{
return l2;
}
if (l2 == NULL)
{
return l1;
}
temp = new ListNode(0);
temp->val = (l1->val + l2->val) % 10;
signal = (l1->val + l2->val) / 10;
temp->next = NULL;
res = temp;
l1 = l1->next;
l2 = l2->next;
while (l1 != NULL && l2 != NULL)
{
if (signal != 0)
{
sum = l1->val + l2->val + signal;
}
else
{
sum = l1->val + l2->val;
}
if (sum >= 10)
{
signal = sum / 10;
}
else
{
signal = 0;
}
temp1 = new ListNode(0);
temp1->val = sum % 10;
temp1->next = NULL;
temp->next = temp1;
temp = temp->next;
l1 = l1->next;
l2 = l2->next;
}
if (l1 == NULL)
{
while (l2 != NULL)
{
if (signal != 0)
{
sum = l2->val + signal;
}
else
{
sum = l2->val;
}
if (sum >= 10)
{
signal = sum / 10;
}
else
{
signal = 0;
}
temp1 = new ListNode(0);
temp1->val = sum % 10;
temp1->next = NULL;
temp->next = temp1;
temp = temp->next;
l2 = l2->next;


}
}
if (l2 == NULL)
{
while (l1 != NULL)
{
if (signal != 0)
{
sum = l1->val + signal;
}
else
{
sum = l1->val;
}
if (sum >= 10)
{
signal = sum / 10;
}
else
{
signal = 0;
}
temp1 = new ListNode(0);
temp1->val = sum % 10;
temp1->next = NULL;
temp->next = temp1;
temp = temp->next;
l1 = l1->next;


}
}
if (signal != 0)
{
temp1 = new ListNode(0);
temp1->val = signal;
temp1->next = NULL;
temp->next = temp1;
temp = temp->next;
}
return res;
}


时间空间开销:把两个链表都遍历了一遍,同时新开辟了一个链表。

0 0
原创粉丝点击