你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,返回和。
若链表存储是从高位开始存储,则将链表先反转再相加。反转链表实现
#include
#include
#includestruct Node
{
int data;
Node* next;
Node() : data(0), next(NULL) {}
};
Node* createList(int* list, int size)
{
if (0 == size)
{
return NULL;
}
Node* head = NULL, *p = NULL;
head = p = new Node();
p->data = https://www.it610.com/article/list[0];
p->next = NULL;
for (int i = 1;
i < size;
i++)
{
Node* cur = new Node();
cur->data = https://www.it610.com/article/list[i];
cur->next = NULL;
p->next = cur;
p = cur;
}return head;
}void toString(Node* pList)
{
Node* p = pList;
while (p)
{
std::cout << p->data << ",";
p = p->next;
}
std::cout << std::endl;
}std::string sumList(Node* pList1, Node* pList2)
{
int flag = 0;
Node* p1 = pList1;
Node* p2 = pList2;
std::vector result;
while (true)
{
int sum = 0;
if (p1 != NULL)
{
sum += p1->data;
p1 = p1->next;
}
if (p2 != NULL)
{
sum += p2->data;
p2 = p2->next;
}
sum += flag;
flag = sum / 10;
result.push_back(sum % 10);
if (p1 == NULL && p2 == NULL)
{
break;
}
}
if (flag > 0)
{
result.push_back(flag);
}
std::ostringstream os;
for (std::vector::reverse_iterator numIter = result.rbegin();
numIter != result.rend();
++numIter)
{
os << *numIter;
}
return os.str();
}int main()
{
int list1[] = {1,3,9,8};
int list2[] = {2,5,7,4,2};
Node* pList1 = createList(list1, sizeof(list1)/sizeof(int));
Node* pList2 = createList(list2, sizeof(list2)/sizeof(int));
toString(pList1);
toString(pList2);
std::cout << sumList(pList1, pList2) << std::endl;
return 0;
}
【两个链表相加求和】
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络