阿里巴巴2014校園招聘算法題

題目:兩個較長的單向鏈表a和b,爲了找出節點node滿足node in a 並且node in b。請設計空間使用盡量小的算法(用c/c++,java 或者僞代碼)

思路:我們定義節點的距離爲節點到鏈表開始所經過的節點數。如果兩個鏈表長度相同,則相交節點其在兩個鏈表上的距離一定相等。對於長度不同的兩個鏈表,我們可以採用對齊的方式,使其向長度短的鏈表對齊。這樣就可以應用上面的思路

具體算法如下:

struct node  
{  
    int v;  
    node *next;  
};  
/* 
返回鏈表的長度 
鏈表爲空 返回0 
*/  
size_t listLen(node * p)  
{  
    size_t num = 0;  
    while (p!=NULL)  
    {  
        num++;  
        p = p->next;  
    }  
    return num;  
}  
// 如果找到了 則返回指針 指向公共節點  
// 如果不存在 則返回空指針  
node * findFirstCommenNode(node * pheada, node * pheadb)  
{  
    size_t lenA = listLen(pheada);  
    size_t lenB = listLen(pheadb);  
  
    node * plistA = pheada;  
    node * plistB = pheadb;  
    //調整長度,讓plistA 指向較長的一個鏈表 
    if (lenA < lenB)  
    {  
        plistB = pheada;  
        plistA = pheadb;  
        size_t t = lenA;  
        lenA = lenB;  
        lenB = t;  
    }  
    while(lenA > lenB)  
    {  
        plistA = plistA->next;  
        --lenA;  
    }  
    //一樣長了  
    //尋找公共節點  
    while (plistA!=NULL && plistA != plistB)  
    {  
        plistA = plistA->next;  
        plistB = plistB->next;  
    }  
    return plistA;  
}  

算法的空間複雜度O(1),時間複雜度O(m+n)

發佈了93 篇原創文章 · 獲贊 16 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章