C++ 如何在C++;?(LeetCode添加两个数字)
以下是我正在解决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
/**
* 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 = ¤tNode;
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节点。我认为我的解决方案过于复杂,因为我认为向后添加两个数字比实际更复杂。如果我们得到一个进位数字,我们只需将它添加到右边的数字,而不是像往常一样添加到左边。如果我们不这样做,那么我们只是像平常一样添加。