题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解决方案:
依据题目描述,创建两个带头结点的单链表,逐个取出其中的数进行相加,相加后的数值取余数作为新的链表的一个节点值,并保留进位。需要注意的是两个链表长度不一样的情况,以及处理最后两个数相加可能产生的进位。
完整程序用例:
#include <iostream>
#include<string>
using namespace std;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct ListNode {
int val;
ListNode *next;
ListNode(int x) {
val = x;
next = nullptr;
}
};
ListNode* createList();
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);
int main() {
ListNode* L1 = createList();
ListNode* L2 = createList();
ListNode* L3 = addTwoNumbers(L1->next, L2->next);
for (L3; L3 != nullptr; L3 = L3->next) {
cout << L3->val;
if(L3->next!=nullptr)
cout<< " -> ";
}
return 0;
}
ListNode* createList() {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = nullptr;
ListNode* r = nullptr;
r = dummyHead;
cout << "input the node number" << endl;
int count;
cin >> count;
for (int i = 0; i < count; i++) {
ListNode* s = new ListNode(0);
cin >> s->val;
r->next = s;
r = s;
}
r->next = nullptr;
return dummyHead;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = nullptr;
ListNode* p1 = l1, *p2 = l2,*curr = dummyHead;
int carry = 0;
while (p1!=nullptr||p2!=nullptr)
{
int x = (p1 != nullptr) ? p1->val : 0;
int y = (p2 != nullptr) ? p2->val : 0;
int sum = x + y + carry;
carry=sum/10;
curr->next = new ListNode(sum % 10);
curr = curr->next;
if (p1 != nullptr)
p1 = p1->next;
if (p2 != nullptr)
p2 = p2->next;
}
if (carry > 0) {
curr->next = new ListNode(carry);
}
return dummyHead->next;
}