题目描述:
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
官方题解:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *head = NULL, *tail = NULL;
int carry = 0;
while (l1 || l2) {
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
int sum = n1 + n2 + carry;
if (!head) {
head = tail = malloc(sizeof(struct ListNode));
tail->val = sum % 10;
tail->next = NULL;
} else {
tail->next = malloc(sizeof(struct ListNode));
tail->next->val = sum % 10;
tail = tail->next;
tail->next = NULL;
}
carry = sum / 10;
if (l1) {
l1 = l1->next;
}
if (l2) {
l2 = l2->next;
}
}
if (carry > 0) {
tail->next = malloc(sizeof(struct ListNode));
tail->next->val = carry;
tail->next->next = NULL;
}
return head;
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/add-two-numbers/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我的题解:
/*进位标志 flag=0
当前节点 p
遍历 (对应位相加+flag)%9 ==0 flag=0
==1 flag =1 创建新结点
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *p,*q,*t;//三个指针,分别指l1,l2,结果链表的当前结点
struct ListNode *L;
struct ListNode *s;
int flag = 0;
p = l1;
q = l2;//多此一举,直接用人家的头指针即可
while(p!=NULL && q!= NULL){//看完题解看我这句,写的真叫人无语
int count;
count = p->val + q->val + flag;
if(count % 9 == 0){//取余9错了 ×
flag = 0;
struct ListNode *s = (struct ListNode*)malloc(sizeof(struct ListNode));
if(p == l1 && q == l2){//如果正在处理的是l1,l2的第一个结点,那么此时的L没有结点
s->val = count;
L = s;//让L指向这个新结点
t = s;
}
s->val = count;
t->next = s;
t = s;
}
else{
flag = 1;
struct ListNode* s = (struct ListNode*)malloc(sizeof(struct ListNode));
if(p == l1 && q == l2){
s->val = count;
L = s;
t = s;
}
s->val = count;
t->next = s;
t = s;
}
}
t->next = NULL;
t = L;
return L;
}
第一次写,思路没有问题,但对语法不熟练,缺乏技巧。
道阻且艰,继续努力。