兩個鏈表的第一個公共結點(兩種解法)

題目:輸入兩個鏈表,找出它們的第一個公共結點。

解法一:不採用任何輔助數據結構,劍指offer標準代碼

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;
}

解法二:採用輔助數據結構棧,劍指offer只提出思想沒有實現

ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2)
{
	ListNode* pTemp1 = pHead1;
	ListNode* pTemp2 = pHead2;
	ListNode* pFirstCommonNode = NULL;
	std::stack<ListNode*> ListStack1;
	std::stack<ListNode*> ListStack2;
	while(pTemp1!=NULL)
	{
		ListStack1.push(pTemp1);
		pTemp1 = pTemp1->m_pNext;
	}
	while(pTemp2!=NULL)
	{
		ListStack2.push(pTemp2);
		pTemp2 = pTemp2->m_pNext;
	}
	while(ListStack1.empty() == false && ListStack2.empty() == false)
	{
		pTemp1 = ListStack1.top();
		pTemp2 = ListStack2.top();
		if(pTemp1 != pTemp2)
			break;
		pFirstCommonNode = pTemp1;
		ListStack1.pop();
		ListStack2.pop();
	}
	return pFirstCommonNode;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章