首先说下我的思路,链表交叉,也就是2个链表最后指向同一块内存区域,所以无论如何,只要交叉,最后一个元素的地址总是相等的...然后,还有一种情况:2个链表内部成环否,当然,只要相交就2个链表都成环了
成环好检测,就是设定2个指针,步长不同,遍历,当成环的时候,会出现2个相等的情况,而如果链表成环的话,相交部分必然包含环,不管从环中何点开始相交,a链表中环中元素必然存在于b链表中,基于这个,我开始写代码了。。。。
首先我构思了一个辅助函数,检测链表成环。而函数的原型我则构思为:

template<typename pNodeName>
BOOL ListIsRing(pNodeName Listhead, pNodeName
* OutNodePointer)

我的构思是:如果成环,返回TRUE以及判定条件的那个指针,OutPutNodePointer就是这个指针,留作程序自用,并且假如不成环的话,程序将返回FALSE以及指向最后节点的指针以备自用。。。

template<typename pNodeName>
BOOL ListIsRing(pNodeName Listhead, pNodeName
* OutNodePointer)
{
    NodeName p1 
= Listhead;
    NodeName p2 
= Listhead;
    assert(NULL 
!= OutPutNodePointer && NULL != *OutPutNodePointer);
    
while(NULL != p1 && NULL !=  p1->next)
    
{
        p1 
= p1->next;
        
if(NULL == p1->next)
        
{
            
break;
        }

        p1 
= p1->next;
        p2 
= p2->next;
        
if(p2 == p1)
        
{
            
*OutPutNodePointer = p1;
            
return TRUE;
        }

    }
 
    
*OutPutNodePointer = p1;
    
return FALSE;
}


这时候我们就可以用这个函数来判断是否有环,并且能获得一个关键点
这个函数的原型我们将定义为

template<typename pNodeName>
BOOL IsIntersect(pNodeName Src1, pNodeName Src2)
{
    BOOL List1Status, List2Status, tempNode;
    pNodeName Node1, Node2;
    List1Status 
= ListIsRing(Src1, &Node1);
    List2Status 
= ListIsRing(Src2, &Node2);
    
if(List1Status != List2Status)
   
{
      
return FALSE;
    }

    
if(Node1 == Node2)
    
{
       
return TRUE;
     }

    
if(List1Status)
    
{
     tempNode 
= Node1->next;
      
while(tempNode != Node1)
      
{
         
if(tempNode == Node2)
         
{
              
return TRUE;
          }

          tempNode 
= tempNode->next;
       }

     }

     
return FALSE; 
}

这时候,当我认为这个题目算是pass掉之后,题目难度加大:找出链表交叉的首点.....经过思考,我大概的认为,思路是,通过上述这个函数IsIntersect,应该再传出来一个指针,也就是代码已经确定相交的点,然后通过这个点,把这个点之前的所有元素的地址复制到一个数组中,然后从数组尾开始往前遍历,任意一个数组到首或者有不相等的情况则跳出。
这个时候,这个函数的形参应该再加上一个Out元素,以供别的函数使用,具体代码我就不写了....欢迎指点我更好的方法。