一.题目
二.思路
①比较两个链表的长度
②链表长度小的高位补0,使长度一致
③模拟加法运算,考虑加数,被加数,低位的进位,得到当前位数的值赋给新的链表
三.实现代码
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
/*
需要重新创建节点对其赋值
如果直接使用l1,l2则无法再找到头结点
*/
ListNode* p= l1;
ListNode* q= l2;
/*
获得两个链表的长度,看是否长度一致
不一致的链表将其补0,长度补成一致
由于是逆序排列,补0的为高位补0,对加法计算无影响
*/
//如果这里是p!=NULL,则运行完后p将指向空值
//当前运行完毕后,p执行链表最后一个值
//但是运行时不会打印最后一个值,因为最后一个值的next为空,无法将最后一个值计算为len长度
//因此len从1开始
int len1 = 1;
while (p->next != NULL) {
cout << p->val<<endl;
len1++;
p = p->next;
}
int len2 = 1;
while (q->next != NULL) {
cout << q->val << endl;
len2++;
q = q->next;
}
/*
判断长度,进行补0操作
*/
if(len1<len2){
//对l1补0
for (int i = 0; i < (len2 - len1); i++) {
p->next = new ListNode();
p = p->next;
}
}
else {
for (int i = 0; i < (len1 - len2); i++) {
q->next = new ListNode();
q = q->next;
}
}
/*
* 计算结果
*/
p = l1;//重新返回表头
q = l2;//重新返回表头
ListNode* l3 = new ListNode(-1);//计算后的头结点
ListNode* w = l3;//移动指针
int add = 0;
while (p!= NULL) {
int a = p->val;
int b = q->val;
int num = 0;
if (add == 1) {//如果有从低处的进位,num+1
num = num + 1;
add = 0;
}
if (a + b > 9) {//如果有进位
num = num+ a + b - 10;
add = 1;
}
else {//如果没有进位
num = num + a + b;
}
if (num > 9) {//如果加上低位的进位后,add
num = num - 10;
add = 1;
}
w->next= new ListNode(num);
w = w->next;
p = p->next;
q = q->next;
}
if (add == 1) {//如果全部size加完后还有进位,最高位上1
w->next = new ListNode(1);
}
return l3->next;//l3的节点存储的val为-1,从l3->next才是计算的值
}
/*
根据数组创建对应的链表
*/
ListNode* createList(int arr[], int size) {
if (size == 0) return nullptr;
ListNode* head = new ListNode(arr[0]);
ListNode* current = head;
for (int i = 1; i < size; ++i) {
current->next = new ListNode(arr[i]);
current = current->next;
}
return head;
}
int main() {
int arr[3] = { 2,4,3 };
ListNode* l1 = createList(arr, 3);
int arr2[3] = { 5,6,4};
ListNode* l2 = createList(arr2, 3);
//最终结果
ListNode* l3 = addTwoNumbers(l1, l2);
return 0;
}