题目描述
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
給定兩個非空鏈表,表示兩個非負整數。數位以相反的順序存儲,每個節點包含一個數字。將兩個數字相加並將其作為鏈表返回。
您可以假設這兩個數字都不包含任何前導0,除了數字0本身。
举例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKdgjSg3-1690019192464)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d1b2dfd4-ad07-428a-ac7b-3cbba1168cdb/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtQi6C2J-1690019192466)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ff30068d-b3a1-4256-b6be-19d77a8ddd0a/Untitled.png)]
分析
我的思路和代码
基本思路:l2加到l1上输出l1
1) 首先,定义两个指针p1,p2分别指向l1和l2的头结点;
2) 设 m = m i n { l e n ( l 1 ) , l e n ( l 2 ) } m=min\{len(l1), len(l2)\} m=min{len(l1),len(l2)},对于前 m-1 个节点,将l2的值对应得加到l1上,如果和大于10,取模并为l1下一个节点—的值增1。
3) 把l2的尾部值加到l1的尾部值上;把l2比l1长的部分(如果l2更长的话)添加到l1尾的后面。
4)从l1原来的尾节点开始遍历剩下的节点,如果值>10,取模给后一个节点值+1
5)如果最后一个节点的值>10,手动添加一个值为1的节点。
代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// ListNode* res = new ListNode(0);
ListNode* p1 = l1;
ListNode* p2 = l2;
//l2 加到l1上
while(p1->next != NULL && p2->next != NULL){
//到倒数第二个节点
int tsum = p1->val + p2->val;
if(tsum >= 10)
p1->next->val +=1;
p1->val = tsum % 10;
p1 = p1->next;
p2 = p2->next;
}
if(p1->next == NULL)
p1->next = p2->next;
p1->val += p2->val;
while(p1 != NULL){
if(p1->val >= 10){
p1->val %= 10;
if(p1->next == NULL){
ListNode *newlast = new ListNode(1, NULL);
p1->next = newlast;
}
else
p1->next->val += 1;
}
p1 = p1->next;
}
return l1;
}
};
比较好的方法
思路
设置一个虚拟头节点,这样做代码也简洁多了!
1)新建初始节点dummy 值为0,指针curr指向它;int carry 暂时存放和;l1,l2是可以移动的指针
2)carry 初值=0, 如果指针l1,l2非空,将它们所指的节点值加到carry上。
3)结果链表新增一个节点,值为carry % 10, 更新carry = carry /10,这样下一轮可以加上进位。
4)只要l1, l2还没完,或者carry不等于0,重复2)3)
5)返回结果。
代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode* curr = &dummy;
int carry = 0;
while (l1 || l2 || carry) {
if (l1 != nullptr) {
carry += l1->val;
l1 = l1->next;
}
if (l2 != nullptr) {
carry += l2->val;
l2 = l2->next;
}
curr->next = new ListNode(carry % 10);
carry /= 10;
curr = curr->next;
}
return dummy.next;
}
};