给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
通常方法(旨在解决问题):
#include <iostream>
#include <List>
#include <vector>
/***************************************************
考察的点:
1,考虑两个链表不对等怎么处理
2,处理最高位的进位
3, 在解决问题的基础上进行优化,待解决
****************************************************/
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1 = 1; // 记录l1长度
int len2 = 1; // 记录l2长度
ListNode* p = l1;
ListNode* q = l2;
while (p->next != NULL) //获取l1长度
{
len1++;
p = p->next;
}
while (q->next != NULL)
{
len2++;
q = q->next;
}
if (len1 > len2)
{
for (int i = 1; i <= len1 - len2; i++) {
q->next = new ListNode(0); //游标节点指针指向新指针
q = q->next; //游标节点指针移动一位
}
}
else
{
for (int i = 1; i <= len2 - len1; i++)
{
p->next = new ListNode(0);
p = p->next;
}
}
p = l1;
q = l2;
bool count = false; //记录进位
ListNode* head = new ListNode(-1); //存放和的链表
ListNode* w = head; //l3的移动指针
int carry = 0;
int i = 0;
while (p != NULL && q != NULL)
{
int x = (p != NULL) ? p->val : 0;
int y = (q != NULL) ? q->val : 0;
int sum = carry + x + y;
carry = sum / 10; //获得carry
w->next = new ListNode(sum % 10); //取余放进新链表中
w = w->next; //游标w指针指向下一个
if (p != NULL) p = p->next;
if (q != NULL) q = q->next;
}
if (carry > 0) {
w->next = new ListNode(carry);
w = w->next;
w->next = NULL;
}
return head->next;
}
};
//创建list
ListNode* generatelistfromvector(vector<int> nums) {
ListNode* head = new ListNode(-1);
ListNode* current = head;
for (int i = 0; i < nums.size(); i++)
{
current->next = new ListNode(nums[i]);
current = current->next;
}
return head->next;
}
//显示list
void showlist(ListNode* head)
{
ListNode* current = head;
while (current != NULL) {
cout << current->val << "," ;
current = current->next;
}
cout << endl;
}
//释放list
void freelist(ListNode* head)
{
ListNode* current = head;
while (current != NULL) {
auto temp = current->next;
delete current;
current = temp;
}
}
//测试
int main()
{
auto list1 = generatelistfromvector({1, 4, 6});
auto list2 = generatelistfromvector({9, 5, 3, 5});
showlist(list1);
showlist(list2);
Solution mytest;
auto mytestresult = mytest.addTwoNumbers(list1, list2);
showlist(mytestresult);
freelist(list1);
freelist(list2);
freelist(mytestresult);
system("pause");
return 0;
}