程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 尋找兩個相交鏈表的第一個公共節點

尋找兩個相交鏈表的第一個公共節點

編輯:C++入門知識

// 尋找兩個鏈表的第一個公共節點.cpp : Defines the entry point for the console application.
//
/*
1.最簡單的方法就是先順序訪問其中一個鏈表,在每訪問一個節點時,都對另外一個鏈表進行遍歷,看節點是否相等
  直到找到一個相等的節點位置,如果鏈表長度分別是m,n 則時間復雜度為O(mn)
2.我們可以知道如果兩個鏈表有公共節點,那麼該公共節點之後的所有節點都是兩個鏈表所共有的,所以長度一定也是
相等的,如果兩個鏈表的總長度是相等的,那麼我們對兩個鏈表進行遍歷,則一定同時到達第一個公共節點。但是鏈表
的長度實際上不一定相同,所以我們只需要計算出兩個鏈表的長度之差n,然後讓長的那個鏈表先移動n步,短的鏈表再
開始向後遍歷,這樣他們一定同時到達第一個公共節點,我們只需要在向後移動的時候比較兩個鏈表的節點是否相等就
可以獲得第一個公共節點。時間復雜度是O(m+n)
*/
#include "stdafx.h"
struct ListNode
{
	int m_data;
	ListNode *m_pNext;
};
unsigned int ListLength(ListNode* pHead)
{
	unsigned int nLength = 0;
	ListNode* pNode = pHead;
	while(pNode != NULL)
	{
		++ nLength;
		pNode = pNode->m_pNext;
	}

	return nLength;
}
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2)
{
	// Get the length of two lists
	unsigned int nLength1 = ListLength(pHead1);
	unsigned int nLength2 = ListLength(pHead2);
	int nLengthDif = nLength1 - nLength2;

	// Get the longer list
	ListNode *pListHeadLong = pHead1;
	ListNode *pListHeadShort = pHead2;
	if(nLength2 > nLength1)
	{
		pListHeadLong = pHead2;
		pListHeadShort = pHead1;
		nLengthDif = nLength2 - nLength1;
	}

	// Move on the longer list
	for(int i = 0; i < nLengthDif; ++ i)
		pListHeadLong = pListHeadLong->m_pNext;

	// Move on both lists
	while((pListHeadLong != NULL) &&
		(pListHeadShort != NULL) &&
		(pListHeadLong != pListHeadShort))
	{
		pListHeadLong = pListHeadLong->m_pNext;
		pListHeadShort = pListHeadShort->m_pNext;
	}

	// Get the first common node in two lists
	ListNode *pFisrtCommonNode = NULL;
	if(pListHeadLong == pListHeadShort)
		pFisrtCommonNode = pListHeadLong;
	return pFisrtCommonNode;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved