Day79 | 灵神 | 反转链表 两数相加 两数相加II

Day79 | 灵神 | 反转链表 两数相加 两数相加II

2.两数相加

2. 两数相加 - 力扣(LeetCode)

思路:

笔者一开始想的是在原数组上面进行改动,但是那个不知道两个链表长度就很麻烦,一个链表结束后还得遍历另外一个链表,并且最后返回结果也只能返回长的链表,这真的很麻烦

所以要新创建一个链表,用新创建的链表节点记录val的值

确定循环终止条件:只要l1 l2 或者进位有一个不为0 那就是要继续循环,继续创建新的节点

也不需要新的变量,用进位carry来记录值即可

最后carry除以10,大于10就是1表示有进位,小于10就是0,也就是没进位

完整代码:

class Solution {
    
    
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        //建立虚拟头结点
        ListNode res;
        ListNode *cur=&res;
        //记录进位
        int carry=0;
        //只要l1 l2 或者carry有一个不为0 那就是要继续循环
        while(l1 || l2 || carry)
        {
    
    
            //l1不为空 加上l1的值
            if(l1)
            {
    
    
                carry+=l1->val;
                l1=l1->next;
            }
            //l2不为空 加上l2的值
            if(l2)
            {
    
    
                carry+=l2->val;
                l2=l2->next;
            }
   			//在创建为下一个结点
            cur->next=new ListNode(carry%10);
            cur=cur->next;
            //新的进位 大于10就是1,小于10就是0
            carry/=10;
        }
        return res.next;
    }
};

445.两数相加II

445. 两数相加 II - 力扣(LeetCode)

思路:

反转链表l1,l2就直接变成两数相加了

得到的结果是l3

再把l3反转就是答案

直接粘贴复制就是了

完整代码:

class Solution {
    
    
public:
    ListNode* reverseList(ListNode* head) {
    
    
        ListNode *p=head;
        ListNode *pre=nullptr;
        while(p!=nullptr)
        {
    
    
            ListNode* q=p->next;
            p->next=pre;
            pre=p;
            p=q;
        }
        return pre;
    }
    ListNode* addtwo(ListNode* l1, ListNode* l2) {
    
    
        //建立虚拟头结点
        ListNode res;
        ListNode *cur=&res;
        //记录进位
        int carry=0;
        //只要l1 l2 或者carry有一个不为0 那就是要继续循环
        while(l1 || l2 || carry)
        {
    
    
            //l1不为空 加上l1的值
            if(l1)
            {
    
    
                carry+=l1->val;
                l1=l1->next;
            }
            //l2不为空 加上l2的值
            if(l2)
            {
    
    
                carry+=l2->val;
                l2=l2->next;
            }
   			//在创建为下一个结点
            cur->next=new ListNode(carry%10);
            cur=cur->next;
            //新的进位 大于10就是1,小于10就是0
            carry/=10;
        }
        return res.next;
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        l1 = reverseList(l1);
        l2 = reverseList(l2); 
        auto l3 = addtwo(l1, l2);
        return reverseList(l3);
    }
};