给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers
题解:
1、高精度的原理
所谓高精度加法其实就是按加法竖式规则相加,即按“位”相加,满十进位。
这里的按“位”相加指的是个位加个位,十位加十位,百位加百位……
2、思路:
根据题意,我们要将按“位”相加的结果同样以链表形式逆序存放,应从左向右依次计算,不断创建结点存放按“位”相加的结果
3、注意:
两原始链表可能不等长
在两链表等长的情况下,若两链表的最后一个结点值相加的值有进位,需要生成一个新的结点存放进位值
#include <iostream>
using namespace std;
/**
* Definition for singly-linked list.
* 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) {}
* };
*/
struct ListNode{
int val;
ListNode *next;
ListNode() : val(0),next(NULL){}
ListNode(int x) : val(x), next(NULL){}
ListNode(int x, ListNode *next) : val(x), next(next){}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);
};
ListNode* Solution::addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode * H = new ListNode();//申请一个ListNode结点,存放结果
ListNode * ptr = H;//定义ListNode类型的ptr指针指向新建的节点
int carry = 0;//carry用于进位计数
while(l1 || l2 || carry)//直到l1,l2和进位都为零,循环结束
{
int val = 0;
if(l1){
val += l1->val;
l1 = l1->next;
}
if(l2){
val += l2->val;
l2 = l2->next;
}
val += carry;
ListNode *node = new ListNode(val % 10);//生成节点存放按位相加的和,如果大于十取余数,向进一位
ptr->next = node;//将相加的和放入存放结果的链表中
ptr = node;//然后ptr指针后移到新加入的节点,ptr始终指向结果链表的位结点
carry =val / 10;//进位计算,val大于十有进位,val小于十没有进位
}
//H->next;
return H->next;
}
class Solution s;
int main(int argc, char *argv[])
{
//创建单链表l1、l2
ListNode* l1 = new ListNode();
ListNode* l2 = new ListNode();
ListNode* p1 = l1;
ListNode* q1 = l1;
ListNode* p2 = l2;
ListNode* q2 = l2;
p1->next = NULL;
int n1 = 342;
int n2 = 465;
while(n1%10)
{
ListNode* node1=new ListNode();
node1->val=n1%10;
node1->next=NULL;
p1->next = node1;
p1 = node1;
n1 = n1 / 10;
}
while(n2%10)
{
ListNode* node2=new ListNode();
node2->val=n2%10;
node2->next=NULL;
p2->next = node2;
p2 = node2;
n2 = n2 / 10;
}
//打印单链表l1、l2
while(q1->next!=NULL)
{
//cout<<l1->val<<" ";
q1=q1->next;
cout<<q1->val<<" ";
}
cout<<endl;
while(q2->next!=NULL)
{
//cout<<l1->val<<" ";
q2=q2->next;
cout<<q2->val<<" ";
}
cout<<endl;
ListNode* res = new ListNode();
//ListNode* p3 = new ListNode();
res = s.addTwoNumbers(l1,l2);
while(res->next!=NULL)
{
res=res->next;
cout<<res->val<<" ";
}
return 0;
}
结果: