链表面试题之双链表操作

题目:

给出两个单向链表的头指针,比如h1h2判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针

解决思路:

如果两个链表相交,那这两个链表肯定有一个交点,而对于这个交点,因为其只有一个next指针,所以一旦两个链表相交,那肯定是一个Y形,而不会形成X形。

这样得到解决方案如下:

如果head1==head2,那么显然相交,直接返回head1 

否则,分别从head1,head2开始遍历两个链表获得其长度len1len2。假设len1>=len2,那么指针p1head1开始向后 移动len1-len2步。指针p2=head2,下面p1p2每次向后前进一步并比较p1p2是否相等,如果相等即返回该结点,否则说明两个链表没有 交点。

代码如下

 1 bool ismix(linknode *list1, linknode *list2)
 2 {
 3     linknode *p=list1;
 4     int len1=0;
 5     while(p)
 6     {
 7         p=p->next;
 8         len1++;
 9     }
10     linknode *q=list2;
11     int len2=0;
12     while(q)
13     {
14         q=q->next;
15         len2++;    
16     }
17     p=list1;
18     q=list2;
19     int len=0;
20     if(len1>=len2)
21     {
22         len=len1-len2;
23         while(len>0)
24         {
25             p=p->next;
26             len--;    
27         }
28     }
29     else
30     {
31         len=len2-len1;
32         while(len>0)
33         {
34             q=q->next;
35             len--;
36         }
37     }
38     while(p||q)
39     {
40         if(p->val==q->val)
41             return true;
42         else
43         {
44             p=p->next;
45             q=q->next;
46         }
47     }
48     return false;
49 }

而这个题目又可以拿来解决有环链表问题(关于有环链表,请看我另外一篇文章http://www.cnblogs.com/cnyao/archive/2009/10/28/interview1.html

如果有环,那么p1p2重合点p必然在环中。从p点断开环,方法为:p1=p, p2=p->next, p->next=NULL。此时,原单链表可以看作两条单链表,一条从head开始,另一条从p2开始,于是运用刚刚的方法,我们找到它们的第一个交点即为所求。

 

参考:

http://www.diybl.com/course/3_program/c++/cppjs/2007114/83948.html

 

 

posted on 2009-10-31 16:03  cnyao  阅读(571)  评论(0编辑  收藏  举报