您的位置:首页 > 其它

找出链表的第一个公共结点

2017-01-12 20:25 429 查看
两个单向链表,找出它们的第一个公共结点。

思想:采用先后指针

unsigned int GetListLength(ListNode* pHead);

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* pFisrtCommonNode = pListHeadLong;

return pFisrtCommonNode;

}

unsigned int GetListLength(ListNode* pHead) {

unsigned int nLength = 0;

ListNode* pNode = pHead;

while (pNode != NULL) {

++nLength;

pNode = pNode->m_pNext;

}

return nLength;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: