leetcode problem solve 2——Add Two Numbers

        题意就不再赘述了,这里主要总结一下解题过程中感触比较深的地方。

       这道题仅仅是medium水平,但是我却做了两个多小时.....我觉得主要原因是我一开始觉得很简单,然后一上来就写代码,没有做好前期的问题剖析工作,导致后面每次提交都出现不同的案例测试无法通过,然后真的就慌乱了,心想:这种问题我居然都无法控制住??!!然后心态就崩了....开始焦躁,又试图使自己再次专注解题。做人真的不能骄傲阿,你以为你自己已经足够冷静,足够理性,这只是你以为....真的到了上战场的时候,还是会因为大意丢掉性命。

       前期的分析工作一定要做好,特殊情况要抽出来,要和普通情况分离开,特殊的提前讨论,提前解决,解决了之后,再进行一般情况的讨论。

       代码:

       

#include<iostream>
#include<vector>
using namespace std;


struct ListNode
{
	int val;
	ListNode() { val = 0; next = NULL; }
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

class Solution
{
public:
	Solution() {}
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
	{
		int time = 0;//计算相加次数
		int tenSignal = 0;
		ListNode* resultList = new ListNode(1);//用于保存结果
		ListNode* curNode = resultList;		   //当前操作的节点
		//只有一位数的先讨论
		if (l1->next == nullptr && l2->next == nullptr)
		{
			int result = l1->val + l2->val;
			int x = result - 10;
			if (x >= 0)
			{
				resultList->val = x;
				ListNode* node = new ListNode(1);
				curNode->next = node;
				curNode = node;
			}
			else
			{
				resultList->val = result;
			}
			return resultList;
		}
		while (l1 != nullptr || l2 != nullptr)
		{
			int result = 0;
			if (l1 != nullptr && l2 != nullptr)
			{
				result = l1->val + l2->val + tenSignal;
				int x = result - 10;
				if (x >= 0)
				{
					tenSignal = 1;
					result = x;
					if (time == 0)
					{
						resultList->val = x;
					}
					else
					{
						ListNode* node = new ListNode(1);
						node->val = x;
						curNode->next = node;
						curNode = node;
					}
					if (l1->next == nullptr && l2->next == nullptr)
					{
						ListNode* node1 = new ListNode(1);
						curNode->next = node1;
						curNode = node1;
					}
				}
				else
				{
					tenSignal = 0;
					if (time == 0)
					{
						resultList->val = result;
					}
					else
					{
						ListNode* node = new ListNode(1);
						node->val = result;
						curNode->next = node;
						curNode = node;
					}
				}				
				l1 = l1->next;
				l2 = l2->next;

			}
			else if (l1 == nullptr && l2 != nullptr)
			{
				//l1不空,l2空
				result = l2->val + tenSignal;
				int x = result - 10;
				if (x >= 0)
				{
					tenSignal = 1;
					//产生1个节点						 
					ListNode* node2 = new ListNode(0);
					curNode->next = node2;
					curNode = node2;
					if (l2->next == nullptr)
					{
						ListNode* node3 = new ListNode(1);
						curNode->next = node3;
						curNode = node3;
					}
				}
				else
				{
					tenSignal = 0;
					if (time == 0)
					{
						resultList->val = result;
					}
					else
					{
						//产生一个节点
						ListNode* node1 = new ListNode(1);
						node1->val = result;
						curNode->next = node1;
						curNode = node1;
					}
				}
				l2 = l2->next;
			}
			else
			{
				//l1不空,l2空
				result = l1->val + tenSignal;
				int x = result - 10;
				if ( x >= 0 )
				{
					tenSignal = 1;
					//产生1个节点						 
					ListNode* node2 = new ListNode(0);					 					 
					curNode->next = node2;
					curNode = node2;
					if (l1->next == nullptr)
					{
						ListNode* node3 = new ListNode(1);
						curNode->next = node3;
						curNode = node3;
					}
				}
				else
				{
					tenSignal = 0;
					if (time == 0)
					{
						resultList->val = result;
					}
					else
					{
						//产生一个节点
						ListNode* node1 = new ListNode(1);
						node1->val = result;
						curNode->next = node1;
						curNode = node1;
					}
				}
				l1 = l1->next;
			}
			time++;
		}//end while
		curNode->next = nullptr;
		return resultList;
	}//end func
};

int main()
{
	//构造两条链表
	ListNode* l1 = new ListNode(3);
	ListNode* l1_cur = l1;
	ListNode node2(7);
	//ListNode node3(9);
	l1_cur->next = &node2;
	l1_cur = &node2;
	/*l1_cur->next = &node3;
	l1_cur = &node3;*/
	l1_cur->next = nullptr;

	ListNode* l2 = new ListNode(9);
	ListNode* l2_cur = l2;
	ListNode node5(2);
	//ListNode node6(3);
	l2_cur->next = &node5;
	l2_cur = &node5;
	/*l2_cur->next = &node6;
	l2_cur = &node6;*/
	l2_cur->next = nullptr;
	//test
	Solution s;
	ListNode* result = s.addTwoNumbers(l2, l1);
	int time = 0;
	while (result)
	{
		cout <<"result: " << result->val << endl;
		result = result->next;	 
		//cout << "time = " << ++time<< endl;
	}

}

  效果:这次还比较满意



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值