【问题标题】:Merging two sorted lists in C在C中合并两个排序列表
【发布时间】:2021-10-06 23:20:49
【问题描述】:

我一直在尝试调试将两个排序列表合并为一个排序列表的代码,我从 leetcode

编写了这个问题
typedef struct{
   int val;
   struct ListNode *next;
}ListNode;
 

ListNode* mergeTwoLists(ListNode* l1,ListNode* l2){
        ListNode* head=(l1!=NULL||l2!=NULL)?(ListNode*)malloc(sizeof(ListNode)):NULL;
        ListNode* temp=head;
        ListNode* temp1=l1;
        ListNode* temp2=l2;
        if(temp!=NULL){
        while(temp1!=NULL&&temp2!=NULL){
                temp->val=(temp1->val<=temp2->val)?temp1->val:temp2->val;
                temp->next=(ListNode*)malloc(sizeof(ListNode));
                temp=temp->next;
                if(temp1->val<=temp2->val){
                        temp1=temp1->next;
                }else{
                        temp2=temp2->next;
                }
        }
        ListNode* temp3=(temp1!=NULL)?temp1:temp2;
        while(temp3!=NULL){
                temp->val=temp3->val;
                temp3=temp3->next;
                if(temp3!=NULL){
                        temp->next=(ListNode*)malloc(sizeof(ListNode));
                }else{
                        temp->next=NULL;
                }
        }
        }
        return head;
}

逻辑对我来说似乎很好,但如果我们举个例子
假设我们将这两个列表传入 ListNode* mergeTwoLists(ListNode* l1,ListNode* l2)
l1-&gt;(1)-&gt;(3)-&gt;(4)-&gt;NULL
l2-&gt;(5)-&gt;(6)-&gt;(7)-&gt;NULL
我的结果:head-&gt;(1)-&gt;(3)-&gt;(4)-&gt;(7)-&gt;NULL
应该是什么:head-&gt;(1)-&gt;(3)-&gt;(4)-&gt;(5)-&gt;(6)-&gt;(7)-&gt;NULL

【问题讨论】:

  • 第二个while 循环应该看起来与第一个while 循环完全相同,只是您应该始终选择temp3,而不是在temp1temp2 之间做出选择。
  • @user3386109 它看起来不能完全一样,因为当我在第一个循环中时 temp 永远不能为 NULL,因为在第二个循环中总会有至少一个要处理的元素,也在第二个循环中我只使用 temp3,它的声明在任何循环之外,所以当你说“除了你应该总是选择 temp3,而不是在 temp1 和 temp2 之间做出决定”时,我不明白你的意思
  • 该函数是应该合并实际列表,还是应该创建一个包含排序结果的新列表,而不改变两个原始列表?

标签: c linked-list


【解决方案1】:

问题是第二个循环:

ListNode* temp3=(temp1!=NULL)?temp1:temp2;
while(temp3!=NULL){
    temp->val=temp3->val;
    temp3=temp3->next;
    if(temp3!=NULL){
        temp->next=(ListNode*)malloc(sizeof(ListNode));

        /* 1 */
        temp = temp->next;
    }else{
        temp->next=NULL;
    }
}

标记 1:您为列表创建了一个新元素,但实际上并没有使用它!这就是为什么所有信息都放在同一个节点中,并且您的输出仅显示第二个列表的最后一个元素。输入temp = temp-&gt;next; 即可解决问题。

编辑:关于您的struct 定义:

typedef struct{
   int val;
   struct ListNode *next;
}ListNode;

它在我的测试代码上抛出了很多警告。建议改为:

typedef struct listnode_t {
   int val;
   struct listnode_t *next;
} ListNode;

【讨论】:

    【解决方案2】:

    让我们也合并你的两个 while 循环!

    • 遍历两个列表
    • 如果第一个列表的值为 NULL,则分配第二个列表的值,反之亦然
    • 如果两个列表都不是空的,则检查值并分配最低值。
    • 如果至少一个列表项(迭代器)不为空,并且在循环结束后将 null 分配给最后一个节点的下一个,则循环将进行。
    ListNode* mergeTwoLists(ListNode* l1,ListNode* l2){
        ListNode* head=(l1!=NULL||l2!=NULL)?(ListNode*)malloc(sizeof(ListNode)):NULL;
        ListNode* temp=head;
        ListNode* temp1=l1;
        ListNode* temp2=l2;
        
        while(temp1!=NULL || temp2!=NULL){
            if (temp1==NULL){
                temp->val = temp2->val;
                temp->next=(ListNode*)malloc(sizeof(ListNode));
                temp = temp->next;
                temp2 = temp2->next;
            }
            if(temp2==NULL){
                temp->val = temp1->val;
                temp->next=(ListNode*)malloc(sizeof(ListNode));
                temp = temp->next;
                temp1 = temp1->next;
            }
            if (temp1->val<=temp2->val){
                temp->val = temp1->val;
                temp->next=(ListNode*)malloc(sizeof(ListNode));
                temp = temp->next;
                temp1=temp1->next;
            }else{
                temp->val = temp2->val;
                temp->next=(ListNode*)malloc(sizeof(ListNode));
                temp = temp->next;
                temp1=temp2->next;
            }
            
        }
        if(temp==NULL){
           temp->next = NULL;
        }
        return head;
    }
    

    让我知道这是否有效。

    【讨论】:

    • 不,我很感激,但我真的想知道我的代码出了什么问题,我没有在寻找新的
    • 函数末尾的temp-&gt;next = NULL; 有问题,因为此时temp 可以为NULL。
    • @prewky ,抱歉,您能否附上您的完整代码,以便我检查、编译和运行?
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多