【发布时间】: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->(1)->(3)->(4)->NULLl2->(5)->(6)->(7)->NULL
我的结果:head->(1)->(3)->(4)->(7)->NULL
应该是什么:head->(1)->(3)->(4)->(5)->(6)->(7)->NULL
【问题讨论】:
-
第二个
while循环应该看起来与第一个while循环完全相同,只是您应该始终选择temp3,而不是在temp1和temp2之间做出选择。 -
@user3386109 它看起来不能完全一样,因为当我在第一个循环中时 temp 永远不能为 NULL,因为在第二个循环中总会有至少一个要处理的元素,也在第二个循环中我只使用 temp3,它的声明在任何循环之外,所以当你说“除了你应该总是选择 temp3,而不是在 temp1 和 temp2 之间做出决定”时,我不明白你的意思
-
该函数是应该合并实际列表,还是应该创建一个包含排序结果的新列表,而不改变两个原始列表?
标签: c linked-list