兩個鍊錶的第乙個公共節點

2021-07-10 11:02:53 字數 1617 閱讀 1037

輸入兩個鍊錶,找出它們的第乙個公共的節點。

碰到這種題的時候千萬不要用挨個遍歷的方法,時間複雜度高

對於兩個有相同節點的鍊錶的形狀一定是y。而不是x。然後還可能乙個鍊錶長乙個鍊錶短,我們可以求出差值,然後讓長鍊表先走差值的長度,然後在挨個比較就可以了。這樣時間複雜度就小很多了:

//// 《劍指offer——名企面試官精講典型程式設計題》**

// 著作權所有者:何海濤

#include "stdafx.h"

#include "..\utilities\list.h"

unsigned int getlistlength(listnode* phead);

listnode* findfirstcommonnode( listnode *phead1, listnode *phead2)

// 先在長鍊表上走幾步,再同時在兩個鍊錶上遍歷

for(int i = 0; i < nlengthdif; ++ i)

plistheadlong = plistheadlong->m_pnext;

while((plistheadlong != null) &&

(plistheadshort != null) &&

(plistheadlong != plistheadshort))

// 得到第乙個公共結點

listnode* pfisrtcommonnode = plistheadlong;

return pfisrtcommonnode;

}unsigned int getlistlength(listnode* phead)

return nlength;

}// ********************測試**********************

void destroynode(listnode* pnode);

void test(char* testname, listnode* phead1, listnode* phead2, listnode* pexpected)

// 第乙個公共結點在鍊錶中間

// 1 - 2 - 3 \

// 6 - 7

// 4 - 5 /

void test1()

// 沒有公共結點

// 1 - 2 - 3 - 4

//

// 5 - 6 - 7

void test2()

// 公共結點是最後乙個結點

// 1 - 2 - 3 - 4 \

// 7

// 5 - 6 /

void test3()

// 公共結點是第乙個結點

// 1 - 2 - 3 - 4 - 5

// 兩個鍊錶完全重合

void test4()

// 輸入的兩個鍊錶有乙個空鍊錶

void test5()

// 輸入的兩個鍊錶有乙個空鍊錶

void test6()

void destroynode(listnode* pnode)

int _tmain(int argc, _tchar* argv)

兩個鍊錶第乙個公共節點

先讓長的鍊錶的指標先走長的之差的步數,兩個再一起走,如果相遇就是第乙個公共節點 如果沒交點,就都走到空 struct listnode class solution while pl2 null 復位指標到頭節點 pl1 phead1 pl2 phead2 int dif len 0 if len1...

兩個鍊錶的第乙個公共節點

題目 輸入兩個鍊錶,找出它們的第乙個公共結點。思路 先遍歷兩個鍊錶得到它們的長度,求出長鍊錶比短鍊錶多幾個 第二次遍歷,在長鍊表上先走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的結點就是它們的第乙個公共結點。public class listnode public listnode find...

兩個鍊錶的第乙個公共節點

題目 輸入兩個鍊錶,找出它們的第乙個公共結點。思路 定義兩個指標,一起走,如果其中乙個走到尾部,則該指標指向另乙個鍊錶頭部。如果有公共節點,這這兩個指標一定會相遇 因為假如長度不一樣的話,其中p1先走完,這時p2剛好走完了p1的長度,也就是剩下的長度為兩個鍊錶的差 此時p1指向p2的鍊錶,當p2走完...