Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?(LeetCode添加两个数字)_C++_Linked List - Fatal编程技术网

C++ 如何在C++;?(LeetCode添加两个数字)

C++ 如何在C++;?(LeetCode添加两个数字),c++,linked-list,C++,Linked List,以下是我正在解决LeetCode上“添加两个数字”问题的解决方案: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNod

以下是我正在解决LeetCode上“添加两个数字”问题的解决方案:


    /**
 * 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) 
{
        int tenPower = 0; 
        
        int num1 = listToNum(l1); 
        int num2 = listToNum(l2); 
        
        //cout << "Finished listToNum."; 
        
        int sum = num1 + num2; 
    
        ListNode currentNode = ListNode(sum%10); 
        ListNode* sumNodePtr = &currentNode; 
        sum /= 10; 
        
        while (sum/10!=0)
        {
            ListNode nextNode = ListNode(sum%10); 
            currentNode.next=&nextNode; 
            currentNode = nextNode; 
            cout << "Here"; 
            sum /= 10; 
        }
        
        currentNode.next = nullptr; 
        
        return sumNodePtr;  
    }
    
    int listToNum (ListNode* l)
    {
        int num = 0;
        int tenPower = 0; 
        
        do 
        {
            num += l->val*pow(10,tenPower); 
            l = l->next; 
        } while (l!=nullptr);
        
        return num;
    }
};


/**
*单链表的定义。
*结构列表节点{
*int-val;
*ListNode*下一步;
*ListNode():val(0),next(nullptr){}
*ListNode(intx):val(x),next(nullptr){
*ListNode(intx,ListNode*next):val(x),next(next){
* };
*/
类解决方案{
公众:
ListNode*AddTwoNumber(ListNode*l1,ListNode*l2)
{
int-tenPower=0;
int num1=列表单位(l1);
int num2=listToNum(l2);
//下一步;
}而(l!=nullptr);
返回num;
}
};
我收到一个“UndefinedHaviorSanitizer”错误。这个问题出现在addTwoNumbers函数的while循环中,我确信它与指针有关。然而,据我所知,我似乎正确地处理了指针。因为我显然不是,我真的想知道到底出了什么问题,希望能从C++中的指针中获得一些更有力的知识。 如何更好地构建一个整数链表?感谢您的帮助。

使用,在LeetCode上不会出现未定义的行为,也不会有太多语句:

static const struct Solution {
    ListNode* addTwoNumbers(ListNode* list_a, ListNode* list_b) {
        ListNode sentinel(0);
        ListNode* ptr = &sentinel;
        int carry = 0;

        while (list_a || list_b || carry) {
            if (list_a) {
                carry += list_a->val;
                list_a = list_a->next;
            }

            if (list_b) {
                carry += list_b->val;
                list_b = list_b->next;
            }

            ptr->next = new ListNode(carry % 10);
            carry /= 10;
            ptr = ptr->next;
        }

        return sentinel.next;
    }
};
除此之外,
listToNum
是一个非常奇怪的助手。我们不必那样做。我们可以简单地遍历列表并求和


工具书类
  • 有关更多详细信息,请参阅,您可以在其中找到大量解释良好的公认解决方案,包括低复杂度算法和渐近/分析

ListNode*sumNodePtr=¤tNode是指向局部变量的指针。在
return
之后,此指针变为悬空,并且在
currentNode.next=&nextNode
num+=l->val*pow(10,十倍功率)
--不应使用浮点函数(如
pow
)来解决基于整数的问题。将数字转换为数字比使用
listToNum
函数容易得多。这是一个链表,你不必重新发明轮子。谢谢你。这是一个更好的解决方案,并向我介绍了如何使用sentinel节点。我认为我的解决方案过于复杂,因为我认为向后添加两个数字比实际更复杂。如果我们得到一个进位数字,我们只需将它添加到右边的数字,而不是像往常一样添加到左边。如果我们不这样做,那么我们只是像平常一样添加。