给定我们两个链表,在这里,我们先讨论单链表不带环的情况,我们该怎么判断它们是否相交?并求出其交点呢。
首先我们来分析一下两个链表相交都有哪几种情况。第一种就是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 }