我必须合并两个排序的链表。 我不知道怎么办,但是t没有增加。代码中有错误吗?
Node * p=(Node*)malloc(sizeof(Node)),*t=p;
while(head1!=NULL && head2!=NULL){
Node * temp=(Node*)malloc(sizeof(Node));
if(head1->data<=head2->data){
temp->data=head1->data;
temp->next=NULL;
t=temp;
head1=head1->next;
t=t->next;
}
else{
temp->data=head2->data;
temp->next=NULL;
t=temp;
t=t->next;
head2=head2->next;
}
}
if(head1==NULL){
t->next=head2;
printf("%d\n",t->data);
}
else
t->next=head1;
return p;
}
3 1个 2 3 是第一个链接列表。
3 4 是第二个链接列表
输出必须是: 1 2 3 3 4
我遇到细分错误
答案 0 :(得分:0)
如果要合并2个列表,则有几个选项。
您所做的不是全部。
从选项1开始:
while(head1!=NULL && head2!=NULL){
Node * temp=(Node*)malloc(sizeof(Node));
if(head1->data<=head2->data){
temp->data=head1->data;
temp->next=NULL;
t=temp;
head1=head1->next;
t=t->next;
}
else{
temp->data=head2->data;
temp->next=NULL;
t=temp;
t=t->next;
head2=head2->next;
}
}
提示:
您可以通过从if else
块中提取相同的指令,并仅在else
块之后编写一次指令来改进代码:
while (head1 != NULL && head2 != NULL) {
Node * temp = malloc(sizeof(Node));
temp->next = NULL;
if (head1->data <= head2->data) {
temp->data = head1->data;
head1 = head1->next;
}
else {
temp->data = head2->data;
head2 = head2->next;
}
// Now link the new node:
t->next = temp; // <<==== Linking fixed.
t = t->next;
}
还请注意,您与新节点的链接已断开。您丢失了从t
到下一个节点的链接。
但是还有另一个问题:
到达列表之一的末尾后,您将停止复制。 您只需将剩余列表一次添加到新列表中即可:
if(head1==NULL){
t->next=head2;
printf("%d\n",t->data);
}
else
t->next=head1;
这意味着您没有副本,但是其余的每个节点都可以通过2个列表获取。
对于旧列表,这意味着第一个节点通过该列表排他地链接,而其他节点有2个引用。
一旦开始处理列表之一,这些节点就可以在一个列表中删除。然后,还有另一个列表中指向这些节点中第一个的链接。 当您通过其余列表访问节点时,这将导致非法的内存访问和未定义的行为。最终可能导致细分失败。
您应该复制所有指针。不停止在任务中间。