head 头部不用来保存数据的方式
思路:
\quad
使用一个结构体,用来存进位的数。
\quad
便利两个链表,求和,整除的作为新节点,余数保存在另一个结构体中(重复使用,重复覆盖)
\quad
最后一个进位需要单独处理(就是重复使用,重复覆盖的那个结构体加到链表末尾)
#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* InitList(ListNode *head, int *n, int length)
{
int a=0;
ListNode *p, *s;
head = new ListNode();
p=head;
for (int i=0; i<length; i++)
{
s = new ListNode(n[i]);
p->next = s;
p=s;
}
return head;
}
//打印链表
void Print(ListNode *head)
{
ListNode *p;
p=head->next;
while(p!=nullptr){
cout<<p->val;
p=p->next;
}
cout<<endl;
}
//链表相加
ListNode *addTwoNum(ListNode *l1, ListNode *l2)
{
ListNode *head, *p, *s, *m; //头指针不装值
head = new ListNode();
m = new ListNode(0); // 存放进位的数
p = head;
//两数相加
while(l1->next!=nullptr || l2->next!=nullptr)
{
if(l1->next!=nullptr && l2->next!=nullptr)
{
l1 = l1->next;
l2 = l2->next;
int result = l1->val + l2->val + m->val;
s=new ListNode(result % 10);
p->next = s;
p = s;
m->val = result / 10;
}else if(l1->next!=nullptr){
l1 = l1->next;
int temp = l1->val + m->val;
s = new ListNode(temp % 10);
p->next = s;
p = s;
m->val = temp / 10;
}else if(l2->next!=nullptr){
l2 = l2->next;
int temp = l2->val + m->val;
s = new ListNode(temp % 10);
p->next = s;
p = s;
m->val = temp / 10;
}
if(l1->next == nullptr && l2->next == nullptr && m->val > 0) //处理最后一个进位的可能
p->next = m;
}
return head;
}
int main()
{
ListNode *l1,*l2;
// int a[]={2,4,6};
// int b[]={5,6,4};
// int a[]={9,9,9,9,9,9,9};
// int b[]={9,9,9,9};
// int a[]={0};
// int b[]={0};
int a[]={2,4,3};
int b[]={5,6,4};
l1 = InitList(l1, a, sizeof(a)/sizeof(a[1]));
l2 = InitList(l2, b, sizeof(b)/sizeof(b[1])) ;
Print(l2);
Print(l1);
ListNode *result = addTwoNum(l1,l2);
Print(result);
return 0;
}
结果
代码中以数组的方式创建链表,给了4组,可自行注释、编译、运行