尽管条件为真,循环仍停止



>我正在将 2 个排序的链表合并为一个排序列表。我的代码获取除最后一个输出之外的所有内容。

class Solution {
private:
ListNode* head = NULL;
ListNode* current1 = NULL;
ListNode* current2 = NULL;
ListNode* current3 = NULL;
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
setPointers(l1,l2); //  set current pointers to beginning of each list
while((current1) && (current2)) {
if((current1->val <= current2->val) || (current2 == NULL)) {  
ListNode* newNode = new ListNode;
newNode->val = current1->val;
current1 = current1->next; 
if(isEmpty(head)) {
head = newNode;
current3 = newNode;
}
else {
current3->next = newNode;
current3 = current3->next;
}
}
else if((current2->val <= current1->val) || (current1 == NULL)) {
ListNode* newNode = new ListNode;
newNode->val = current2->val;
current2 = current2->next; 
if(isEmpty(head)) {
head = newNode;
current3 = newNode;
}
else {
current3->next = newNode;
current3 = current3->next;
}
}
}
return head;
}
bool isEmpty(ListNode* head) {
if(head == NULL) 
return true;
return false;
}
void setPointers(ListNode* list1, ListNode* list2) {
current1 = list1;
current2 = list2;
}
};`
您的输入 [1,2,4] [1,3,4] 输出 [1,1,2,3,4]

预期 [1,1,2,3,4,4]

我认为 while 循环一直持续到电流 1 和电流 2 都为 NULL,但它似乎在进行最后一次比较之前停止了。

仅当两个操作数为真(即在您的情况下不为空(时,&&运算符的计算结果才为 true。一旦至少有一个操作数为假,循环就会停止。

您可能想要while (current1 || current2),它将在至少一个操作数不为空时循环。

编辑: 另外,请注意评估顺序:

if((current1->val <= current2->val) || (current2 == NULL))

在检查它是否不为 null 之前,您正在访问current2(&&&和 || 条件从左侧计算,当结果从第一个操作数的值明显时短路(。

您也不能确定上述条件中的current1不为空。

这不是对您的问题的直接回答,而是评论,我无法将其放入评论部分。为什么你的代码如此复杂?合并两个列表是一个非常简单的操作 - 您的代码也应该如此:

Node* merge(Node* list1, Node* list2) {
Node* head = nullptr;
auto tail = &head;
while (list1 && list2) {
auto& list = (list2->value < list1->value) ? list2 : list1;
*tail = std::exchange(list, list->next);
tail  = &(*tail)->next;
}
if (list1)
*tail = list1;
else if (list2)
*tail = list2;
return head;
}

代码越简单,出错的机会就越少。

演示

相关内容

  • 没有找到相关文章

最新更新