力扣链接:https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
老办法,先自己写,然后看别人的思路,优化自己的代码,记录自己的心路历程;
有main方法,代码可以直接运行。
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
// my first source:
//class Solution {
//public:
//
// // 展示链表所有元素
// void display(ListNode* l1){
// while(l1 != NULL){
// cout<<l1->val<<" ";
// l1 = l1->next;
// }
// cout<<endl;
// }
//
// // 在尾结点p后面插入
// void insertByEnd(ListNode* &p, int val){
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
*temp = ListNode(val);
// ListNode *temp = new ListNode(val);
// p->next = temp;
// p = temp;
// }
//
// ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// int val = l1->val + l2->val;
ListNode *l3 = (ListNode *)malloc(sizeof(ListNode));
*l3 = ListNode(val % 10);
// ListNode *l3 = new ListNode(val % 10);
// ListNode *p = l3;
// val /= 10;
// l1 = l1->next;
// l2 = l2->next;
// while(l1 != NULL && l2 != NULL){
// val = l1->val + l2->val + val;
// insertByEnd(p, val % 10);
// l1 = l1->next;
// l2 = l2->next;
// val /= 10;
// }
// while(l1 != NULL){
// val = l1->val + val;
// insertByEnd(p, val % 10);
// l1 = l1->next;
// val /= 10;
// }
// while(l2 != NULL){
// val = l2->val + val;
// insertByEnd(p, val % 10);
// l2 = l2->next;
// val /= 10;
// }
// if(val != 0){
// insertByEnd(p, val);
// }
// return l3;
// }
//};
// greater: 代码优化,与性能无关(这里把我的三个while合并成了一个,写出来的代码更简洁)
class Solution {
public:
// 展示链表所有元素
void display(ListNode* l1){
while(l1 != NULL){
cout<<l1->val<<" ";
l1 = l1->next;
}
cout<<endl;
}
// 在尾结点p后面插入
void insertByEnd(ListNode* &p, int val){
ListNode *temp = new ListNode(val);
p->next = temp;
p = temp;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int val = l1->val + l2->val;
ListNode *l3 = new ListNode(val % 10);
val /= 10;
ListNode *p = l3;
l1 = l1->next;
l2 = l2->next;
while(l1 != NULL || l2 != NULL){
int a = (l1 != NULL) ? l1->val : 0;
int b = (l2 != NULL) ? l2->val : 0;
val = a + b + val;
p->next = new ListNode(val % 10);
p = p->next;
if(l1 != NULL){
l1 = l1->next;
}
if(l2 != NULL){
l2 = l2->next;
}
val /= 10;
}
if(val != 0){
p->next = new ListNode(val);
}
return l3;
}
};
int main(){
Solution sol;
// 构建好链表 a, b
// int a[] = {2, 4, 3};
// int b[] = {5, 6, 4};
// int a[] = {9, 7, 6, 9};
// int b[] = {5, 6, 8};
int a[] = {0};
int b[] = {7, 3};
// ListNode *l1 = (ListNode *)malloc(sizeof(ListNode));
// *l1 = ListNode(a[0]);
ListNode *l1 = new ListNode(a[0]);
ListNode *p1 = l1;
int len1 = sizeof(a) / sizeof(int);
for(int i = 1; i < len1; i++){
sol.insertByEnd(p1, a[i]);
}
sol.display(l1);
// ListNode *l2 = (ListNode *)malloc(sizeof(ListNode));
// *l2 = ListNode(b[0]);
ListNode *l2 = new ListNode(b[0]);
ListNode *p2 = l2;
int len2 = sizeof(b) / sizeof(int);
for(int i = 1; i < len2; i++){
sol.insertByEnd(p2, b[i]);
}
sol.display(l2);
// 相加求和
ListNode *l3 = sol.addTwoNumbers(l1, l2);
sol.display(l3);
}