原题地址(中等)
又回到最初的起点。。。
今天和昨天的每日一题,分别是力扣的第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;}};
