2两数相加

1、问题描述

问题描述:
	给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
	如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
	您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:
	输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
	输出:7 -> 0 -> 8
	原因:342 + 465 = 807

2、解决思路

解决思路:
	当给定的两个链表都不为空时,进行加法,添加新节点,并设置进位;
	当一个表为空,另一表不为空,进行赋值(注意如果前面有进位,需要加1),添加新节点,并设置进位;
	最后两个表都为空,做检查是否产生进位,如果产生进位,还需要新添加一个新节点。

3、代码实现

/*
问题描述:
	给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
	如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
	您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:
	输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
	输出:7 -> 0 -> 8
	原因:342 + 465 = 807

解决思路:
	当给定的两个链表都不为空时,进行加法,添加新节点,并设置进位;
	当一个表为空,另一表不为空,进行赋值(注意如果前面有进位,需要加1),添加新节点,并设置进位;
	最后两个表都为空,做检查是否产生进位,如果产生进位,还需要新添加一个新节点。
*/

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

//定义结构体
struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}	
};


ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	ListNode *Head, *L, *LNew;
	// 申请头结点
	Head = new ListNode(0);
	L = Head;
	L->next = NULL;	

	//定义一个进位标志符
	int flag = 0;
	//定义一个临时求和变量sum
	int sum = 0;
	
	//当l1和l2都不为空时,进行两个链表的加法
	while (l1 != NULL && l2 != NULL) {
		LNew = new ListNode(0);
		//判断前面的数相加是否产生进位
		if (flag == 1) {
			sum = l1->val + l2->val + 1;
			//大于9,需要进位
			if (sum > 9) {
				LNew->val = sum - 10;
				flag = 1;
			}
			else
			{
				LNew->val = sum;
				flag = 0;
			}
		}
		else
		{
			sum = l1->val + l2->val;
			//大于9,需要进位
			if (sum > 9) {
				LNew->val = sum - 10;
				flag = 1;
			}
			else
			{
				LNew->val = sum;
				flag = 0;
			}
		}
		
		//插入结点
		L->next = LNew;
		LNew->next = NULL;
		L = L->next;

		l1 = l1->next;
		l2 = l2->next;		
	}

	//判断是否还有不为空的List
	//当l2为空,l1不为空时,进行单链表加法,此时应注意是否有进位
	while(l1 != NULL) {
		LNew = new ListNode(0);
		if (flag == 1) {
			sum = l1->val + 1;
			//大于9,需要进位
			if (sum > 9) {
				LNew->val = sum - 10;
				flag = 1;
			}
			else
			{
				LNew->val = sum;
				flag = 0;
			}
		}
		else
		{
			sum = l1->val;
			//大于9,需要进位
			if (sum > 9) {
				LNew->val = sum - 10;
				flag = 1;
			}
			else
			{
				LNew->val = sum;
				flag = 0;
			}
		}

		L->next = LNew;
		LNew->next = NULL;
		L = L->next;

		l1 = l1->next;
	}
	//当l1为空, l2不为空时,进行单链表加法,此时应注意是否有进位
	while (l2 != NULL)
	{ 
		LNew = new ListNode(0);
		if (flag == 1) {
			sum = l2->val + 1;
			if (sum > 9) {
				LNew->val = sum - 10;
				flag = 1;
			}
			else
			{
				LNew->val = sum;
				flag = 0;
			}
		}
		else
		{
			sum = l2->val;
			if (sum > 9) {
				LNew->val = sum - 10;
				flag = 1;
			}
			else
			{
				LNew->val = sum;
				flag = 0;
			}
		}

		L->next = LNew;
		LNew->next = NULL;
		L = L->next;

		l2 = l2->next;
	}
	

	//超过给定两个List长度, 如果还有进位,需要再添加一个结点
	if (l1 == NULL && l2 == NULL && flag == 1) {
		LNew = new ListNode(0);
		LNew->val = 1;
		L->next = LNew;
		LNew->next = NULL;
		L = L->next;
	}


	
	return Head;
}

//创建带有头结点的链表
ListNode* creatList(vector<int> &v) {
	ListNode *Head, *L, *LNew;
	// 申请结点
	Head = new ListNode(0);
	L = Head;
	L->next = NULL;

	//创建新结点
	for (int i = 0; i < v.size(); ++i) {
		LNew = new ListNode(0);
		LNew->val = v[i];

		L->next = LNew;
		LNew->next = NULL;
		L = L->next;
	}	

	return Head;
}

//打印链表
void printList(ListNode *L) {
	while (L != NULL) {
		cout << L->val << ' ';
		L = L->next;
	}
	cout << endl;
}


int main()
{
	//创建
	ListNode *list1, *list2, *list3;
	vector<int> v1, v2;
	
	//v1 = { 2,4,3 };
	//v2 = { 5,6,4 };

	v1 = { 1, 8 };
	v2 = { 9 };


	list1 = creatList(v1);
	list1 = list1->next;
	list2 = creatList(v2);
	list2 = list2->next;
	
	//printList(list1);
	//printList(list2);

	list3 = addTwoNumbers(list1, list2);
	list3 = list3->next;

	printList(list3);

	return 0;
}

原文地址:https://www.cnblogs.com/komean/p/10899475.html