您的位置:首页 > 其它

两个链表的第一个公共结点

2015-10-07 16:53 211 查看
题目:输入两个链表,找出他们的第一个公共结点。

方法1:分别把两个链表的节点放入两个栈里,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的结点。时间和空间复杂度都是O(m+n)。

方法2:先遍历两个链表得到它们的长度,因此直到哪个链表比较长,以及长链表比短链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。

ListNode* FindFirstCommonNode(ListNode *pHead1, ListNode* pHead2){
//得到两个链表的长度
unsigned int nLength1 = GetListLength(pHead1);
unsigned int nLength2 = GetListLength(pHead2);

int nLengthDif = nLength1 - nLength2;

ListNode* pListHeadLong = pHead1;
ListNode* pListHeadShort = pHead2;
if (nLength2 > nLength1){
pListHeadLong = pHead2;
pListHeadShort = pHead1;
nLengthDif = nLength2 - nLength1;
}

//先在长链表上走几步,再同时在两个链表上遍历
for (int i = 0; i < nLengthDif; ++i){
pListHeadLong = pListHeadLong->m_pNext;
}

while ((pListHeadLong != NULL) && (pListHeadShort != NULL) && (pListHeadLong != pListHeadShort)){
pListHeadLong = pListHeadLong->m_pNext;
pListHeadShort = pListHeadShort->m_pNext;
}

//得到第一个公共结点
ListNode* pFirstCommonNode = pListHeadLong;

return pFirstCommonNode;
}

unsigned int GetListLength(ListNode* pHead){
unsigned int nLength = 0;
ListNode* pNode = pHead;
while (pNode != NULL){
++nLength;
pNode = pNode->m_pNext;
}

return nLength;
}


测试用例

功能测试(输入的两个链表有公共交点:第一个公共结点在链表的中间,第一个公共结点在链表的末尾,第一个公共结点是链表的头结点;输入的两个链表没有公共结点)。

特殊输入测试(输入的链表头结点是NULL指针)

相关题目:如何求两个结点的最低公共祖先。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表