leetcode 2 两数相加
这个题的思路是,我们给返回值事先分配好一个节点的内存,然后把它填好后,立即在当前周期把下个节点的内存也分配好,然后指向下个节点。
这样有个问题就是到最高位的时候,如果上次并没有进位,那就不应该分配进位的那个节点,但是内存已经分配出来了,所以找一个变量把上个节点的地址记录下来,如果检查最后一次没有进位,就把这个节点的next置为NULL,同时还要把下一个节点free掉。
typedef struct ListNode listnode;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
listnode *head, *temp, *temp2;
int n1, n2, carry = 0;
head = (listnode *)malloc(sizeof(listnode));
temp = head;
while (l1 != NULL || l2 != NULL) {
n1 = (l1 ? l1->val : 0);
n2 = (l2 ? l2->val : 0);
temp->val = (n1 + n2 + carry) % 10;
carry = (n1 + n2 +carry) / 10;
temp->next = (listnode *)malloc(sizeof(listnode)); // 分配进位节点
temp2 = temp;
temp = temp->next;
if (l1) {
l1 = l1->next;
}
if (l2) {
l2 = l2->next;
}
}
if (carry != 0) {
temp->val = carry;
temp->next = NULL;
} else {
temp2->next = NULL;
free(temp); // 如果没有进位,记得释放预分配的进位节点。其实不释放也能过,就是不太好
}
return head;
}