/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *p = l1,*q = l2,*r;
struct ListNode *p1 = l1,*q1 = l2;
struct ListNode* l = (struct ListNode*)malloc(sizeof(struct ListNode));
l->next = 0;
int length1 = 0,length2 = 0,add = 0;
while(p1 != 0){
length1++;
p1 = p1->next;
}
while(q1 != 0){
length2++;
q1 = q1->next;
}
if(length1 >=length2){
while(q != 0){
add += p->val + q->val;
if(add >= 10){
p->val =add-10;
add = 1;
}
else{
p->val =add;
add = 0;
}
r = p;
p = p->next;
q = q->next;
}
while(p !=0){
add +=p->val;
if(add >= 10){
p->val =add-10;
add = 1;
}
else{
p->val =add;
add = 0;
}
r = p;
p = p->next;
}
if(add){
l->val = 1;
r->next = l;
l->next == 0;
}
return l1;
}
else{
while(p != 0){
add += q->val + p->val;
if(add >= 10){
q->val =add-10;
add = 1;
}
else{
q->val =add;
add = 0;
}
r = q;
q = q->next;
p = p->next;
}
while(q !=0){
add +=q->val;
if(add >= 10){
q->val =add-10;
add = 1;
}
else{
q->val =add;
add = 0;
}
r = q;
q = q->next;
}
if(add){
l->val = 1;
r->next = l;
l->next == 0;
}
return l2;
}
}
一、第二题先求两个链表的长度length1和length2,在长的链表中做加法
二、长链表与短链表第一个数相加,如果相加之和小于10,则把值赋给长的链表;若大于等于10则把个位数赋给长链表,并记进位符add为1.
三、长短链表第二个数相加并加上进位符,以此类推。若短链表所有值加完,长链表中还有数,长链表中值加add(例:8->5->1->1 + 2->4 = 0-> 0->2->1,短链表完成,进位符为1,第三位为2,此时进位符为0,第四位不变为1)
四、若两链表相加后,长度大于长的链表,则再开辟一个节点“l”储存进位符(例9->9->9 + 1 = 0-> 0->0->1)。注意:新开辟的“l”中next指针未指向任何空间,可能出现runtime error: member access within misaligned address 0xbebebebebebebebe for type ‘struct ListNode’, which requires 8 byte alignment (ListNode.c) 0xbebebebebebebebe: note: pointer points here 错误,应该添加l->next = NULL;
这篇博客详细介绍了LeetCode第二题的解决方案,即如何求两个链表的和。首先计算两个链表的长度,然后在较长的链表上进行加法操作。接着逐位相加,考虑进位,并处理链表不等长的情况。最后,当链表相加后长度超过最长链表时,要确保新开辟的节点内存对齐,防止运行时错误。
2万+

被折叠的 条评论
为什么被折叠?



