LCR 025. 两数相加 II
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 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]
提示:
链表的长度范围为 [1, 100]
0 <= node.val <= 9
输入数据保证链表代表的数字无前导 0
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
我的代码(c语言)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode *fir,*sec,*thi;
if(head==NULL) return NULL;
else if(head->next==NULL) return head;
else
{
fir = NULL;
sec = head;
thi = head->next;
while(thi!=NULL)
{
sec ->next=fir;
fir=sec;
sec = thi;
thi = thi->next;
}
sec->next=fir;
return sec;
}
}
struct ListNode* createNode(int value)
{
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); // 分配内存
newNode->val = value; // 初始化数据字段
newNode->next = NULL; // 初始化指针字段为NULL
return newNode;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode* r1=reverseList(l1);
struct ListNode* r2=reverseList(l2);
struct ListNode* r3=createNode(0);
struct ListNode* head=r3;
int carry = 0;
while(l1||l2)
{
int n1 = (r1!=NULL) ? r1->val :0;
int n2 = (r2!=NULL) ? r2->val :0;
int sum = n1 + n2 + carry;
r3->val=(sum%10);carry=sum/10;
r3->next=createNode(carry);
r3=r3->next;
if(r1)
{
r1 = r1->next;
}
if(r2)
{
r2 = r2->next;
}
}
if(carry>0)
{
r3->next=createNode(carry);
}
return reverseList(head);
}
结果显示超时,请问我的代码存在什么问题?
又改了相关代码,但是WA了,请问问题出在哪?
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL, *curr = head, *next;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
struct ListNode* createNode(int value)
{
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = value;
newNode->next = NULL;
return newNode;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *r1=reverseList(l1),*r2=reverseList(l2),*head=createNode(0);
struct ListNode *rcrd=head;
int carry = 0;
while (r1 != NULL || r2 != NULL || carry > 0) {
int sum = (r1 != NULL) ? l1->val : 0;
sum += (r2 != NULL) ? r2->val : 0;
sum += head->val;
carry = sum / 10;
head->val=sum%10;
head->next=createNode(carry);
r1 = r1 != NULL ? r1->next : r1;
r2 = r2 != NULL ? r2->next : r2;
head=head->next;
}
return reverseList(rcrd);
}