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;
}