445、两数相加 II
题目:
解答:
反转链表,head指向最低位,开始逐位相加,并且需要注意是否有进位。计算结束后再反转链表。
注意其中是否有l1/l2为空的情况
class Solution {//反转链表函数ListNode* rev(ListNode* head){//长度为0或者1,不翻转if(head==nullptr || head->next==nullptr)return head;//非空时,递归过程中new_head一直为原来链表末节点,不变auto new_head = rev(head->next);//head下一个节点指向自己head->next->next=head;//head指向空,保证当前为末尾节点head->next=nullptr;return new_head;}//两数相加,carry记录进位情况ListNode* addtwo(ListNode* l1,ListNode *l2,int carry=0){//l1,l2全空,如果有进位则创建新的node为1,否则返回空指针if(l1==nullptr && l2==nullptr){return carry ? new ListNode(carry):nullptr;}//保证l1非空,简化代码if(l1==nullptr)swap(l1,l2);//l2存在则+l2的val,否则+0carry+=l1->val+(l2?l2->val:0);//可能产生两位数,取余,l1的next递归,carry/10存储前一位是否进位l1->val=carry%10;l1->next=addtwo(l1->next,(l2?l2->next:nullptr),carry/10);return l1;}public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {l1=rev(l1);l2=rev(l2);auto l3=addtwo(l1,l2);return rev(l3);}
};
时间复杂度O(n) n为较长的链表长度
空间复杂度O(n)