这个题两个序列都是倒序,而结果也是要倒序,这分明就是让要按着链表顺着来做,负负得正嘛。
如果求出每个链表的实际数值是不可行的,用例里会有unsigned都放不下的值,考虑逐个相加,用变量记录进位。
在两个链表的公共长度里,逐个相加,用sum记录进位给下一个相加时加上1,直到其中一个链表走完。
因为两个链表是不等长的,所以要么是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) {
ListNode *p, *q, *temp;
temp = p = l1;//相加后直接覆盖l1,不用另外创建链表了,所以要用两个指针操作,一个判断一个存数
q = l2;
int num1; //第一个链表的元素
int num2;// 第二个链表的元素
int sum = 0; //记录两元素的和 还有进位
while(temp != nullptr && q != nullptr){
p = temp;
num1 = temp->val;
num2 = q->val;
sum += num1 + num2;
if(sum < 10){
sum %= 10;
temp->val = sum;
sum = 0; //和小于10,不用进位
temp = temp->next;
q = q->next;
}else{
sum %= 10;
temp->val = sum;
sum = 1; //和大于10,要进位
temp = temp->next;
q = q->next;
}
}
if(temp == nullptr && q != nullptr){
while(q != nullptr){
p->next = new ListNode();
p = p->next;
num2 = q->val;///加法
sum += num2;
if(sum < 10){
p->val = sum%10;
sum = 0;
q = q->next;
}else{
p->val = sum%10;
sum = 1;
q = q->next;
}
}
if(sum == 1){ //最后一位也可能要进位,需要另外判断
p->next = new ListNode();
p = p->next;
p->val = 1;
sum = 0;
}
}else if(temp != nullptr && q == nullptr){
while(temp !=nullptr){
p = temp;
num1 = temp->val;
sum += num1;
if(sum < 10){
p->val = sum%10;
sum = 0;
temp = temp->next;
}else{
p->val = sum%10;
sum = 1;
temp = temp->next;
}
}
}else{
if(sum == 1){
p->next = new ListNode();
p = p->next;
p->val = 1;
sum = 0;
}
}
if(sum == 1){ //给l1长时的判断,可有可无
p->next = new ListNode();
p = p->next;
p->val = 1;
}
return l1; //覆盖完l1直接返回l1
}
};
作者:mtyao-lu-qi-xiu-zi-jia-you-gan
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/jian-dan-de-pan-duan-ran-hou-zhu-ge-xian-01mm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。