给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将两个数相加起来,则会返回一个新的链表来表示它们的和。
例如:
输入:(2->4->3)+(5->6->4)
输出:7->0->8
原因:342+465=807
整体思路:
将长度较短的链表在末尾补零使得两个链表长度相等,再一个一个元素对其相加(考虑到进位):
- 获取两个链表所对应的长度;
- 在较短的链表末尾补零;
- 对齐相加考虑进位;
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x):val(x),next(nullptr){}
};
class Solution {
public:
ListNode* Add(ListNode* L1, ListNode* L2) {
int len1 = 1;
int len2 = 1;
ListNode* p = L1;/*移动指针*/
ListNode* q = L2;/*移动指针*/
while (p->next!=nullptr) {
++len1;
p = p->next;/*L1的长度*/
}
while (q->next != nullptr) {
++len2;
q = q->next;/*L2的长度*/
}
if (len1 > len2)/*判断,L1比L2长*/ {
for (int i = 0; i <= len1 - len2; ++i) {
q->next = new ListNode(0);
q = q->next;
}
}
else/*否则,L2比L1长*/ {
for (int i = 0; i <= len2 - len1; ++i) {
p->next = new ListNode(0);
p = p->next;
}
}
p = L1;
q = L2;
bool count = false; /*记录进位*/
ListNode* L3 = new ListNode(-1);/*存放结果的链表*/
ListNode* T = L3; /*L3移动指针*/
int i = 0;/*记录结果*/
while (p != nullptr && q != nullptr) {
i = count + p->val + q->val;
T->next = new ListNode(i % 10);
count = i > 10 ? true : false;
T = T->next;
p = p->next;
q = q->next;
}
if (count) /*若最后还有进位*/
{
T->next = new ListNode(1);
T = T->next;
}
return L3->next;
}
ListNode* Create();
void Print(ListNode* head);
/*private:
ListNode* head, * tail;*/
};
ListNode* Solution::Create() {
ListNode* p1,*head,*tail;
head = new ListNode(0);
if (head == nullptr) {
head = new ListNode(0);
}
head->next = nullptr;
tail = head;
int k,t;
cout << "请输入链表的长度:";
cin >> k;
cout << endl;
cout << "请输入链表的数值:";
while (k) {
p1 = new ListNode(0);
if (p1 == nullptr) {
cout << "分配内存失败" << endl;
return head;
}
cin >> t;
p1->val = t;
tail->next = p1;
tail = p1;
tail->next = nullptr;
--k;
}
return head;
}
void Solution::Print(ListNode* head) {
ListNode* p2 = head->next;
if (p2 == nullptr) {
cout << "链表是空的,分配内存失败" << endl;
}
while (p2 != nullptr) {
cout << p2->val << " ";
p2 = p2->next;
}
}
int main()
{
cout << "创建链表1:" << endl;
Solution dp1;
ListNode* d1=dp1.Create();
dp1.Print(d1);
cout <<'\n'<< endl;
cout << "创建链表2:" << endl;
Solution dp2;
ListNode* d2=dp2.Create();
dp2.Print(d2);
cout << '\n' << endl;
Solution dp;
ListNode* d = dp.Add(d1, d2);
dp.Print(d);
return 0;
}
版权声明:本文为Jiangtagong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。