1.复杂的就是一个一个的判断,复杂度O(m*n);
2.稍微便捷点的就是判断最后一个节点是否相等,复杂度O(m+n);
3.知道了两个链表的长度len1,len2,那么先让长的链表向后遍历abs(len1-len2),再进行同时遍历并一对一比较,这样的话复杂度为O(max(m,n))。
O(m+n)的代码如下:
View Code
/*=========================================================================== * Function name: FindNode * Parameter: pHead1,pHead2分别为待判断的链表头结点 * Precondition: 两个链表已经建立 * Postcondition: NONE * Description: 判断两个单向链表是否有交点并返回交点 * Return value: 交点 ===========================================================================*/ NODE* FindNode(NODE* pHead1, NODE* pHead2) { NODE* p1 = pHead1; NODE* p2 = pHead2; int i = 1, j = 1, k = 0, f = 0; if(pHead2 == NULL || pHead2 == NULL) { return NULL; } while(p1->next != NULL) { p1 = p1->next; i++; } while(p2->next != NULL) { p2 = p2->next; j++; } if(p1 != p2) { return NULL; } else { f = fabs(i, j); if(i > j) { p1 = pHead1; p2 = pHead2; } else { p1 = pHead2; p2 = pHead1; } for(k=0; k<f; k++) { p1 = p1->next; } while(p1 != p2) { p1 = p1->next; p2 = p2->next; } return p1; } }