leetcode-2

leetcode-2

题面

image-20201122204729665

原题https://leetcode-cn.com/problems/add-two-numbers/submissions/

思路:题目并不要求求出两数相加的结果,只要求结果的各个数字,所以不要用+运算符,会溢出,一位一位的加即可

重点

  • 需要考虑输入的某一个链表为NULL的情况
  • 需要考虑输入的两个链表长度不一致的情况
  • 需要考虑输入的两个链表长度一致、最后一位加完之后还有进位的情况

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {

        ListNode* result = new ListNode();
        ListNode* tResult = result;
        
        //处理某一个列表为空的特殊情况
        if(l1== nullptr)
        {
            result = l2;
            return result;
        }
        if(l2 == nullptr)
        {
            result = l1;
            return result;
        }
        int v1 = l1->val;
        int v2 = l2->val;
        int sum = 0;
        int carry = 1;
        int i=0;
        
        //必须加上carry>0的条件,因为可能两个列表长度相同,最后一位加完之后还有进位
        while((l1 != nullptr) || (l2 != nullptr) || carry>0 )
        {
            if(l1 !=nullptr && l2!=nullptr )
            {
                int tv1 = l1->val;
                int tv2 = l2->val;
                //这个地方处理的很不优雅,不过GCC应该能做好分支预测吧。。。
                if(i==0){
                    sum = (tv1+tv2)%10;
                    tResult->val = sum;
                    carry = (tv1+tv2)/10;
                }
                else{
                    sum = (tv1+tv2+carry)%10;
                    tResult->val = sum;
                    carry = (tv1+tv2+carry)/10;
                }

                l1 = l1->next;
                l2 = l2->next;
                if(l1!=nullptr || l2!=nullptr || carry>0)
                {
                    tResult->next = new ListNode();
                    tResult = tResult->next;
                }
            }
            
            //需要考虑两个链表长度不一致的情况
            else if(l1 != nullptr){
                int tv1 = l1->val;
                sum = (tv1+carry)%10;
                carry = (tv1+carry)/10;
                tResult->val = sum;
                l1 = l1->next;
                if(l1 != nullptr || carry>0)
                {
                    tResult->next = new ListNode();
                    tResult = tResult->next;
                }
            }
            
            //需要考虑两个链表长度不一致的情况
            else if(l2!=nullptr){
                int tv2 = l2->val;
                sum = (tv2+carry)%10;
                carry = (tv2+carry)/10;
                tResult->val = sum;
                l2 = l2->next;
                if(l2 !=nullptr || carry>0)
                {
                    tResult->next = new ListNode();
                    tResult = tResult->next;
                }
            }
            else{
                tResult->val = carry;
                carry = 0;
            }
            i++;
            
        }
        return result;
    }
};

posted on 2021-12-17 20:04  coderabcd  阅读(68)  评论(0)    收藏  举报

导航