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

时间:2020-06-09 19:03:25

标签: c++ sorting pointers data-structures linked-list

我要将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循环一直持续到current1和current2都为NULL为止,但是它似乎在进行最后一次比较之前就停止了。

2 个答案:

答案 0 :(得分:4)

{<1>}运算符仅在两个两个操作数均为真(即您的情况下不为null)时才为真。一旦至少一个操作数为假,循环就会停止。

您可能想要&&,它将在至少一个操作数不为null时循环。

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

while (current1 || current2)

您正在访问if((current1->val <= current2->val) || (current2 == NULL)) ,然后检查它是否不为空(&&和||条件从左开始评估,当从第一个操作数的值明显得出结果时短路)。

您不能确定上述条件下的current2也不为空。

答案 1 :(得分:0)

这不是您问题的直接答案,而是一条评论,我无法在评论部分进行介绍。为什么您的代码如此复杂?合并两个列表是非常简单的操作-您的代码也应该如此:

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;
}

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

Demo