解法:大数加法模拟
技巧:对于链表,可申请哑节点(dummy),便于管理头节点。 加法过程:相应位的和用一个数
t
e
m
p
temp
temp临时保存。在这过程中会用到两个值,一个是当前位的非进位和,可以用
t
e
m
p
%
10
temp\%10
temp%10;另一个是进位,可以用
t
e
m
p
/
10
temp/10
temp/10得到。 最后,加法做完后,如果进位不为0,直接赋给最高位(当前最高位的下一位)。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *dummy = malloc(sizeof(struct ListNode));
dummy->next = NULL;
struct ListNode *tempNode = dummy;
int carry = 0;
while(l1 || l2)
{
tempNode->next = malloc(sizeof(struct ListNode));
tempNode = tempNode->next;
tempNode->next = NULL;
int temp = carry;
if(l1)
{
temp += l1->val;
l1 = l1->next;
}
if(l2)
{
temp += l2->val;
l2 = l2->next;
}
tempNode->val = temp % 10;
carry = temp / 10;
}
if(carry)
{
tempNode->next = malloc(sizeof(struct ListNode));
tempNode = tempNode->next;
tempNode->next = NULL;
tempNode->val = carry;
}
tempNode = dummy->next;
free(dummy);
return tempNode;
}
时间复杂度
O
(
n
)
O(n)
O(n):需要遍历
l
1
l1
l1和
l
2
l2
l2。 空间复杂度
O
(
1
)
O(1)
O(1):返回的链表不计入其中。
|