博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Add Two Numbers
阅读量:6235 次
发布时间:2019-06-22

本文共 2254 字,大约阅读时间需要 7 分钟。

Add Two Numbers这个题目是:把两个整型的数字用两个链表表示,然后把这两个数字相加,最后的结果仍然用链表表示。这个题目能很好的体现一个人对于这种算法题的解题思路,是很好的一个题目。

这个题目很需要算法设计的那四个步骤:

1.设计算法,通过举例子、画图、划分子问题(分治或DP)等方法。

2.设计测试用例

3.编写代码实现

4.对代码进行Debug

所以下面说一下具体的过程:

1.设计算法

这个题目传进来的两个头指针是可以随便移动的,没必要在另外设置两个head指针,直接移动头指针就可以了。

产生的新的链表需要一个头结点,一个当前结点指针。

注意两个数相加的进位,就可以了。最后return头结点的next。

 

2.测试用例

1.一个链表是NULL,则返回另一个链表就可以了。2.两个链表不是一般长,长的那个多余的部分直接挂在结果链表的后面,但是注意进位。例如18+249999,最后要增加一个结点3.两个链表一样长,但是最高位有进位,所以要在malloc一个新的结点,例如345+789

  

3.代码实现

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {	ListNode *result = NULL;	ListNode *cur = NULL;	int carry = 0;	ListNode dummy(-1);	result = &dummy;	cur = result;	if(l1 == NULL)	{		result = l2;		return result;	}	if(l2 == NULL)	{		result = l1;		return result;	}	while(l1 != NULL || l2 != NULL)	{		int val1 = l1 == NULL ? 0 : l1->val;		int val2 = l2 == NULL ? 0 : l2->val;				int sum = val1 + val2 + carry;		ListNode *tmp = NULL;		tmp = (ListNode*)malloc(sizeof(ListNode));		tmp->val = sum % 10;		carry = sum / 10;		tmp->next = NULL;		cur->next = tmp;		cur = cur->next;		tmp = NULL;		if(l1 != NULL)			l1 = l1->next;		if(l2 != NULL)			l2 = l2->next;	}	if(carry == 1)	{		ListNode *tmp = (ListNode*)malloc(sizeof(ListNode));		tmp->val = 1;		tmp->next = NULL;		cur->next = tmp;		cur = cur->next;		tmp = NULL;	}	return result->next;}

  

4.Debug测试代码。

总结:

对于同时处理两个链表,有两种方法:

1.同时循环两个链表,如果任何一个结束了,就停止循环。然后单独处理剩下的那部分的链表的结点。

2.同时循环两个链表,直到最长的那个循环结束才停止循环,短的那个不够的部分补充合适的数字,比如0或者其他的值。

本题用到的就是第二种的方法。

 

对于题目中的这种思路就是,按最长的那个链表循环,短的那个链表补上合适的值,0或者其他的值。和上面的这个问题相似的问题就是:

二进制数字的加法,例如a=“11”,b=“1”,那么最后的结果c=“100”。首先加法运算的低位置在字符串的高位置,所以字符串要首先逆序一下。还有就是C++的string和vector有类似的函数来操作这个string。

string addBinary(string a, string b){	string c;	int carry = 0;	int alen = a.size();	int blen = b.size();	int len = alen > blen ? alen : blen;	reverse(a.begin(), a.end());	reverse(b.begin(), b.end());	int i = 0;	while(i < len)	{		int avalue = i >= alen ? 0 : (a[i]-'0');		int bvalue = i >= blen ? 0 : (b[i]-'0');		int cvalue = (avalue + bvalue + carry) % 2;		carry = (avalue + bvalue + carry) / 2;		c.insert(c.begin(), cvalue + '0');		i++;	}	if(carry == 1)	{		c.insert(c.begin(), '1');	}	return c;}

  注意reverse函数和sort函数都在#include <algorithm>头文件中,string有begin()和end()函数,然后就是insert()函数。

转载于:https://www.cnblogs.com/stemon/p/4700562.html

你可能感兴趣的文章
【转】 利用.dSYM和.app文件准确定位Crash位置
查看>>
python中type dtype astype 的用法
查看>>
centos6.8/6.9 升级openssh的升级openssh-7.5p1.tar.gz
查看>>
使用ngnix做服务器的负载均衡
查看>>
盒子传值
查看>>
使用NSStream来实现Socket
查看>>
iPhone开发之调用系统提示音教程
查看>>
OAuth认证协议原理分析及使用方法
查看>>
二叉树
查看>>
linux 文件搜索命令
查看>>
黄聪:登陆页优化
查看>>
黄聪:Python+NLTK自然语言处理学习(一):环境搭建
查看>>
leetcode110
查看>>
剑指Offer 10 斐波那契数列
查看>>
Ruby之基本数据类型(三)
查看>>
集合框架
查看>>
技术总结
查看>>
mysql基本操作
查看>>
redis设置最大内存上限对置换策略的解读
查看>>
IOS代码布局(一) UIView
查看>>