Y型单链表交点求解代码输出异常,请求排查错误原因
单链表交点求解代码错误排查
给定两个长度分别为N和M的单链表,编写程序求解它们的交点。输入示例对应的链表结构为:链表1是1→2→10→15→30,链表2是6→9→10→15→30,正确输出应为15,但我的代码输出为10。以下是我的代码,请帮忙找出错误所在:
int intersectPoint(Node* head1, Node* head2) { unordered_set<Node*> list1; int output; while(head1->next!=NULL){ list1.insert(head1); head1=head1->next; } while(list1.find(head2)!=list1.end()){ head2=head2->next; } output=head2->data; return output; }
错误点分析
- 节点遗漏问题:第一个循环用
head1->next!=NULL作为终止条件,会漏掉链表的最后一个节点。比如示例中的10节点会被存入集合,但15、30不会被加入,导致后续判断出错。正确的循环条件应该是while(head1!=NULL),确保所有节点都被存入哈希集合。 - 循环逻辑颠倒:第二个循环的逻辑完全错误,当前代码是当
head2存在于集合中时就向后移动,这会跳过交点本身。正确逻辑应该是:当head2不在集合中时才向后移动,直到找到第一个存在于集合中的节点,这个节点就是两个链表的交点。 - 空指针风险:如果两个链表没有交点,
head2最终会走到NULL,此时直接访问head2->data会触发空指针异常,需要先判断head2是否为空。
修正后的代码示例
int intersectPoint(Node* head1, Node* head2) { unordered_set<Node*> list1; // 遍历第一个链表,存入所有节点 while(head1 != NULL){ list1.insert(head1); head1 = head1->next; } // 遍历第二个链表,找第一个在集合中的节点 while(head2 != NULL && list1.find(head2) == list1.end()){ head2 = head2->next; } // 存在交点则返回data,无交点按题目要求返回-1 return head2 != NULL ? head2->data : -1; }
内容的提问来源于stack exchange,提问作者sakshi jain
相关产品推荐
相关产品推荐

