链表面试题之双链表操作
题目:
给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针
解决思路:
如果两个链表相交,那这两个链表肯定有一个交点,而对于这个交点,因为其只有一个next指针,所以一旦两个链表相交,那肯定是一个Y形,而不会形成X形。
这样得到解决方案如下:
如果head1==head2,那么显然相交,直接返回head1 。
否则,分别从head1,head2开始遍历两个链表获得其长度len1与len2。假设len1>=len2,那么指针p1由head1开始向后 移动len1-len2步。指针p2=head2,下面p1、p2每次向后前进一步并比较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 }
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