leetCode第二题
最开始我得想法是既然都是逆向的链表,就把他们正过来,按照整型进行运算,然后最后得出结果以后再你想输出就可以了。所以最开始我的代码如下:
但是提交代码之后发现报错
发现我没有注意到题目中说的链表问题。只是当成了一个普通的列表进行操作。
并且还要注意当位数过多时会有溢出,因此这种方法不可取。
解题方法:
利用链表,按位相加。如果超过10,就进位,留下除以10以后的余数。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
# 建立一个空链表
struct ListNode *head = NULL, *tail = NULL;
int carry = 0;
while (l1 || l2) {
#位上有数值就赋值,没有赋值为0.直到没有值为止。
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;
}