7.编程判断俩个链表是否相交
2014-12-16 11:00
302 查看
题目:给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?
第5题的加强版,具体分析可以看第5题.
代码实现:
typedef struct node{
int value;
struct node *next;
}Node;
Node *testCircle(Node *head)//判断链表是否存在环,如果存在环,则返回环的其中一个点
{
Node *slow,*fast;
if(head==NULL)
return NULL;
slow=head;
fast=head;
while(slow!=NULL&&fast!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)//找到环的其中一个点
return slow;
}
return NULL;
}
int isJoinedSimple(Node *head1,Node *head2)//判断两个无环链表是否相交
{
if(head1==NULL||head2==NULL)
return 0;
while(head1->next!=NULL)
head1=head1->next;
while(head2->next!=NULL)
head2=head2->next;
return head1==head2;
}
int isJoined(Node *head1,Node *head2)//判断两个链表是否相交
{
Node *circle1,*circle2;
circle1=testCircle(head1);
circle2=testCircle(head2);
if(circle1==NULL&&circle2==NULL)//两个链表都没形成环
return isJoinedSimple(head1,head2);
if(circle1!=NULL&&circle2!=NULL)//两个链表都形成环
{
if(circle1==circle2)
return 1;
Node *p=circle1;
p=circle1->next;
while(p!=circle1)//检查链表circle2节点是否在第一个链表的环里面
{
if(p==circle2)
return 1;
p=p->next;
}
}
return 0;
}
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?
第5题的加强版,具体分析可以看第5题.
代码实现:
typedef struct node{
int value;
struct node *next;
}Node;
Node *testCircle(Node *head)//判断链表是否存在环,如果存在环,则返回环的其中一个点
{
Node *slow,*fast;
if(head==NULL)
return NULL;
slow=head;
fast=head;
while(slow!=NULL&&fast!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)//找到环的其中一个点
return slow;
}
return NULL;
}
int isJoinedSimple(Node *head1,Node *head2)//判断两个无环链表是否相交
{
if(head1==NULL||head2==NULL)
return 0;
while(head1->next!=NULL)
head1=head1->next;
while(head2->next!=NULL)
head2=head2->next;
return head1==head2;
}
int isJoined(Node *head1,Node *head2)//判断两个链表是否相交
{
Node *circle1,*circle2;
circle1=testCircle(head1);
circle2=testCircle(head2);
if(circle1==NULL&&circle2==NULL)//两个链表都没形成环
return isJoinedSimple(head1,head2);
if(circle1!=NULL&&circle2!=NULL)//两个链表都形成环
{
if(circle1==circle2)
return 1;
Node *p=circle1;
p=circle1->next;
while(p!=circle1)//检查链表circle2节点是否在第一个链表的环里面
{
if(p==circle2)
return 1;
p=p->next;
}
}
return 0;
}
相关文章推荐
- 7.微软亚院之编程判断俩个链表是否相交(为了简化问题,我们假设俩个链表均不带环)
- 算法-微软亚院之编程判断俩个链表是否相交
- 7. 微软亚院之编程判断俩个链表是否相交
- 每天学习一算法系列(8) (编程判断俩个链表是否相交)
- 7.微软亚院之编程判断俩个链表是否相交(如果需要求出俩个链表相交的第一个节点)
- 7.微软亚院之编程判断俩个链表是否相交(如果链表可能有环)
- 7 微软亚院之编程判断俩个链表是否相交,相交的首节点
- 第7题 微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交,并找出第一个相交结点。
- 微软亚院之编程判断俩个链表是否相交
- 编程判断俩个链表是否相交
- 算法面试100题——7.微软亚院之编程判断俩个链表是否相交
- 7.微软亚院之编程判断俩个链表是否相交
- 微软亚院之编程判断俩个链表是否相交
- 【编程题目】编程判断俩个链表是否相交 ☆
- 7.微软亚院之编程判断俩个链表是否相交(链表)
- 7、微软亚院之编程判断俩个链表是否相交
- 编程判断俩个链表是否相交
- 编程之美:编程判断两个链表是否相交
- 编程之美3.6 编程判断两个链表是否相交
- 读书笔记之编程之美 - 3.6 编程判断两个链表是否相交