发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目。(前两天没更是因为去拔牙了~~>_<~~)
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
示例2:输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
示例3:输入:l1 = [0], l2 = [0]
输出:[0]来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers-ii
该问题本质是链表加法问题,它实现了将两个链表表示的数字相加的功能。具体解决方法如下:
首先创建两个空向量L1
和L2
,用于存储链表中的数字。然后通过遍历链表,将链表中的数字依次存入相应的向量中。
接下来,代码获取了两个向量的大小,并创建一些变量来辅助计算;然后,根据两个向量的大小关系,分别处理不同的情况:
- 如果
L1
的大小大于等于L2
的大小,那么从右向左遍历两个向量,并进行加法运算:如果两个数字相加结果大于等于10,则需要进位。代码通过创建新节点,并将其连到结果链表的头部,来表示相加的结果; - 如果L2的大小小于L1的大小,先按上面的方法处理L2长度的部分;接着,处理在
L1
中剩余的数字。对于像L2
中没有的部分,只需要对数字进行加法运算,并进行进位处理;最后,如果最高位的计算结果有进位,需要创建一个新节点来表示进位的结果。 - 如果
L2
的大小大于L1
的大小,那么处理方式与上述相同,只是将L1
和L2
的角色互换。最后,将结果链表返回。
整体上,解决方案实现了链表加法的功能,通过遍历链表中的数字,进行逐位相加,并处理进位的情况,最终得到新链表表示的相加结果。代码如下:
/**
* 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) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
vector<int> L1,L2;
if(l1==NULL) return l2;
if(l2==NULL) return l1;
while(l1!=NULL)
{
L1.push_back(l1->val);
l1=l1->next;
}
while(l2!=NULL)
{
L2.push_back(l2->val);
l2=l2->next;
}
int size1=L1.size();
int size2=L2.size();
ListNode* L,*temp;
if(size1>=size2)
{
int flag=0,offset=size1-size2,num;
L=NULL;
for(int i=size2-1;i>=0;i--)
{
num=L1[i+offset]+L2[i]+flag;
if(num>=10)
{
num-=10;
flag=1;
}
else flag=0;
temp=new ListNode;
temp->val=num;
temp->next=L;
L=temp;
}
for(int i=offset-1;i>=0;i--)
{
num=L1[i]+flag;
if(num>=10)
{
num-=10;
flag=1;
}
else flag=0;
temp=new ListNode;
temp->val=num;
temp->next=L;
L=temp;
}
if(flag==1)
{
temp=new ListNode;
temp->val=1;
temp->next=L;
L=temp;
}
}
else
{
int flag=0,offset=size2-size1,num;
L=NULL;
for(int i=size1-1;i>=0;i--)
{
num=L2[i+offset]+L1[i]+flag;
if(num>=10)
{
num-=10;
flag=1;
}
else flag=0;
temp=new ListNode;
temp->val=num;
temp->next=L;
L=temp;
}
for(int i=offset-1;i>=0;i--)
{
num=L2[i]+flag;
if(num>=10)
{
num-=10;
flag=1;
}
else flag=0;
temp=new ListNode;
temp->val=num;
temp->next=L;
L=temp;
}
if(flag==1)
{
temp=new ListNode;
temp->val=1;
temp->next=L;
L=temp;
}
}
return L;
}
};
匆忙结束~拜拜~