常见链表面试题之判断链表是否相交,并求交点

   给定我们两个链表,在这里,我们先讨论单链表不带环的情况,我们该怎么判断它们是否相交?并求出其交点呢。

   首先我们来分析一下两个链表相交都有哪几种情况。第一种就是Y型,它们从某一个节点相交,第二种是V型,它们直到尾节点才相交。下面两幅图分别对应两种情况。

1.Y型相交

           

2. V型相交

           

其实不难发现,如果两个链表相交的话,它们的尾节点肯定是相同的。所以如果要判断两个链表是否相交,我们可以遍历两个链表,看它们的尾节点是否相等,相等就能判定其相交。isCross函数,如果相交返回1,否则返回0.

 1 int isCross(PNode pHead1, PNode pHead2)
 2 {
 3     PNode pnode1 = pHead1;
 4     PNode pnode2 = pHead2;
 5     if (pHead1 != NULL && pHead2 != NULL)
 6     {
 7         while (pnode1->pnext != NULL)
 8         {
 9             pnode1 = pnode1->pnext;
10         }
11         while (pnode2->pnext != NULL)
12         {
13             pnode2 = pnode2->pnext;
14         }
15         if (pnode1 == pnode2)  //判断尾节点是否相等
16         {
17             return 1;
18         }
19     }
20     return 0;
21 }

要求其交点的话(第一个交点),我们的思路应该很明显,就是找到其中第一个相等的节点,便是他们的第一个交点。

但此时就要考虑怎么进行节点的比较了,因为有Y型和V型,我们不能直接从第一个节点进行遍历比较,所以应该再写一个length函数用来求链表的长度,然后让长的链表先走,当走到一样长的地方开始进行比较,找到相等的节点就返回这个节点。

length函数:

 1 int length(PNode pHead)
 2 {
 3     PNode pnode = pHead;
 4     int len = 0;
 5     if (pHead == NULL)
 6     {
 7         return 0;
 8     }
 9     while (pnode)
10     {
11         len++;
12         pnode = pnode->pnext;
13     }
14     return len;
15 }

GetCrossNode求交点函数:

 1 PNode GetCrossNode(PNode pHead1, PNode pHead2)
 2 {
 3     PNode pnode1 = pHead1;
 4     PNode pnode2 = pHead2;
 5     int len1 = length(pHead1);
 6     int len2 = length(pHead2);
 7     int step = len1 - len2;
 8     if (0 == isCross(pHead1, pHead2) || pHead1 == NULL || pHead2 == NULL)
 9     {
10         return NULL;
11     }
12 
13     if (step >= 0)
14     {
15         while (step--)
16         {
17             pnode1 = pnode1->pnext;
18         }
19         while (pnode1)
20         {
21             if (pnode1 == pnode2)
22             {
23                 return pnode1;
24             }
25             pnode1 = pnode1->pnext;
26             pnode2 = pnode2->pnext;
27         }
28     }
29     else
30     {
31         step = 0 - step;
32         while (step--)
33         {
34             pnode2 = pnode2->pnext;
35         }
36         while (pnode2)
37         {
38             if (pnode1 == pnode2)
39             {
40                 return pnode1;
41             }
42             pnode1 = pnode1->pnext;
43             pnode2 = pnode2->pnext;
44         }
45     }
46     return NULL;
47 }

 

posted @ 2016-05-20 15:36  Mr_listening  阅读(480)  评论(0编辑  收藏  举报
橙.文森特博客