面试收集--关于链表的一些面试题
2013-05-07 22:47
260 查看
链表相关的面试题是经常出现的,今天总结一下~
1.如何判断一个链表是否有环?如果有,找到环的入口?
设置快慢指针,快指针步长为2,慢指针步长为1,如果有环,最终快慢指针会相遇,代码如下:
1.如何判断一个链表是否有环?如果有,找到环的入口?
设置快慢指针,快指针步长为2,慢指针步长为1,如果有环,最终快慢指针会相遇,代码如下:
boolhasCircle(Node*head,Node*&encounter)
{
Node*fast=head,*slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==low)
{
encounter=fast;
returntrue;
}
}
//fast==NULL||fast->next==NULL
encounter=NULL;
returnfalse;
}
至于如何确定环入口,请看下图
设入口点距链表头部head有x步,由于必然相遇,设相遇点距入口点有y步,环长度为r(表示环中有r+1个节点),那么有判断相遇的算法可知
(x+y)*2=nr+(x+y)=>nr=x+y=>(n-1)r+r-y=x
由上面的分析可知,设置两个指针,一个初始为head,另一个初始为encounter,同步前进,一旦相遇就是入口,于是有了下面的代码:
Node*findEntry(Node*head,Node*encounter)
{
Node*p1=head,*p2=encounter;
while(p1!=p2)
{
p1=p1->next;
p2=p2->next;
}
returnp1;
}
来源:
2.假设有两个单链表,给出头指针head1和head2,判断两个链表是否有交点?
先判断是否有环,不过题目一般会给定无环条件。如果没有给出,可以判断,判断算法如下:
如果无环,遍历两个链表,得到两个链表的长度m和n,先遍历较长链表|m-n|次,接着同步遍历两个链表,一旦相同,则找到相同节点,否则返回null。