【发布时间】:2020-01-01 16:44:31
【问题描述】:
问题是使用存储链表每个节点的地址值的数组来找到两个链表的合并点。
我尝试增加更改头指针的地址大小,但似乎对长链表没有帮助。
int findMergeNode(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
SinglyLinkedListNode **a;
a=(SinglyLinkedListNode**)malloc(200*sizeof(SinglyLinkedListNode));
int i=0;
while(head1){
a[i]=head1;
head1=head1->next;
i++;
}
while(head2){
SinglyLinkedListNode *p=head2;
for(int j=0;j<i;j++){
if(a[j]==p){
return p->data;
}
}
head2=head2->next;
}
return -1;
}
【问题讨论】:
-
无需创建数组即可完成任务。此外,使用幻数 200 还不清楚。
-
是的,我遇到了问题,列表的大小可能比 200 还要大。是的,我知道这不是最好的和最佳的解决方案。
-
当前代码从节点返回
data。返回指向节点的指针(如果没有合并点则返回NULL)不是更有用吗?您可以轻松地从合并的节点指针中获取data值,但反之则更难,尤其是在data值不唯一的情况下。 -
没有必要创建一个数组(额外的空间),尽管这是可以使用比简单算法更快的问题之一,但会以使用额外空间为代价。
-
OT: about:
a=(SinglyLinkedListNode**)malloc(200*sizeof(SinglyLinkedListNode));1) 在 C 中,返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 2) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,调用perror( "malloc failed" );将你的错误信息和系统认为错误发生的原因输出到stderr。
标签: c arrays pointers linked-list