鏈表重合是一個好玩的問題。原題目是這樣的:有兩個鏈表,那么如何判斷這兩個鏈表是不是重合的?至于這個鏈表在什么時候重合的,這不重要,關(guān)鍵是判斷這個鏈表究竟有沒有重合。究竟有什么方法呢?
最簡單的方法就是查看兩者有沒有共同點。那么依次判斷就行了。
int find_node_in_link(LINK_NODE* pLink, LINK_NODE* pNode)
{
while(pLink){
if(pLink == pNode)
return 1;
pLink = pLink->next;
}
return 0;
}
STATUS find_if_link_merge(LINK_NODE* pLinkOne, LINK_NODE* pLinkTwo)
{
LINK_NODE* pHead;
if(NULL == pLinkOne || NULL == pLinkTwo)
return FALSE;
pHead = pLinkTwo;
while(pHead){
if(find_node_in_link(pLinkOne, pHead))
return TRUE;
pHead = pHead->next;
}
return FALSE;
}
另外一種方法就是計數(shù)的方法,既然鏈表在某處重合,那么此點訪問的次數(shù)就是2,所以我們可以依次把兩個鏈表遍歷一下,最后查看有沒有節(jié)點的count為2即可。
typedef struct _LINK_NODE
{
int data;
int count;
struct _LINK_NODE* next;
}LINK_NODE;
void process_all_link_node(LINK_NODE* pNode)
{
assert(NULL != pNode);
while(pNode){
pNode->count ++;
pNode = pNode->next;
}
}
從計數(shù)的方法,我們可以發(fā)現(xiàn)如果兩個鏈表是重合的,那么他們的最后一個節(jié)點必然是相同的,所以只要判斷最后一個節(jié)點是否相同即可。
STATUS find_if_link_merge(LINK_NODE* pLinkOne, LINK_NODE* pLinkTwo)
{
assert(NULL != pLinkOne && NULL != pLinkTwo);
while(pLinkOne->next) pLinkOne = pLinkOne->next;
while(pLinkTwo->next) pLinkTwo = pLinkTwo->next;
return (pLinkOne == pLinkTwo) ? TRUE : FALSE;
}
總結(jié):
(1)鏈表重合的題目雖然簡單,但是從不同的角度可以有不同的答案;
(2)本題目來自《編程之美》, 如果對解法還有興趣的朋友可以參考《編程之美》。