这个面试经常会碰到的题目,判断两个单链表是否相交。个人理解的也不是很深,零零散散的从网上找答案,并把所偶看到的整理了一下,希望对大家有帮助。
判断两个单链表是否相交共有三种情况:
1,两个单链表都没有环。
2,两个单链表中 一个有环,一个没有环。
3,两个链表都有环。
看第一种情况,连个单链表相交,只能是y型相交,不可能是x型相交,理由如下,有两个链表,La,Lb,他们的交点设为p吧,假设在La中,p的前驱为pre_a,后继为next_a,在Lb中,前驱为pre_b,后继为next_b,则pre_a->next=p,pre_b_next=p,接下来看后继,p->next=next_a,p->next=next_b;然后问题就出来了,大家应该知道,一个单链表的next指针只有一个,怎么跑出两个来呢,所以两个链表相交只能值Y型相交。继续解释,两个链表从交点后的其他节点都是一样的,这样只判断最后一个节点是否相交就可以知道两个单链表时候是相交了。判断完之后,还需要寻找链表的交点。求出两个链表的长度:len_a,len_b,求出差值len(len为较大的减去较小的值)。让长的那个先走len步,之后两个链表一起走,直至有点相同的时候。下面给出独立的算法:
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void is_intersect(LinkList La,LinkList Lb)
{
LNode *pa,*pb;
int len_a=0,len_b=0;
pa=La;
pb