原题地址(中等)
又回到最初的起点。。。
今天和昨天的每日一题,分别是力扣的第1、2题。
这道题没啥算法,就是细节不少。
模拟两数相加的过程就完事了。
我用了以下几种方法。
方法1
令p1为长度较长的链表的指针,p2为较短的链表的指针,然后把p2所指的链表的值加到p1上
这样做空间复杂度是 O(1)
,但是比较耗时
class Solution {
public:
int calListLen(ListNode* l) {
int len = 0;
while(l) {
l = l->next;
len++;
}
return len;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry = 0, len1, len2, tmp;
len1 = calListLen(l1);
len2 = calListLen(l2);
ListNode* p1, *p2, *head;
if(len1 >= len2){
p1 = l1;
p2 = l2;
head = l1;
}
else{
p1 = l2;
p2 = l1;
head = l2;
}
while(p1) {
tmp = p2 ? p1->val + p2->val + carry : p1->val + carry;
p1->val = tmp % 10;
carry = tmp / 10;
p1 = p1->next;
if(p2) p2 = p2->next;
}
if(carry){
p1 = head;
while(p1->next){
p1 = p1->next;
}
p1->next = new ListNode(carry);
}
return head;
}
};
方法2
新建一个链表,如果l1,l2长度不同,则对短的那一个补零,使其长度相同。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int a=0, carry=0;
ListNode* p=l1,* q=l2;
ListNode* h = new ListNode(0);
ListNode* r = h;
while(p || q || carry)
{
int num=0;
num += (p) ? p->val : 0;
num += (q) ? q->val : 0;
if(p) p = p->next;
if(q) q = q->next;
num += carry;
carry = num/10;
num %= 10;
ListNode* temp = new ListNode(num);
r->next = temp;
r = temp;
}
r->next = NULL;
return h->next;
}
};