一步一步寫演算法(之鍊錶重合)

2021-06-01 13:26:33 字數 816 閱讀 2275

鍊錶重合是乙個好玩的問題。原題目是這樣的:有兩個鍊錶,那麼如何判斷這兩個鍊錶是不是重合的?至於這個鍊錶在什麼時候重合的,這不重要,關鍵是判斷這個鍊錶究竟有沒有重合。究竟有什麼方法呢?

最簡單的方法就是檢視兩者有沒有共同點。那麼依次判斷就行了。

int find_node_in_link(link_node* plink, link_node* pnode)

return 0;

}status find_if_link_merge(link_node* plinkone, link_node* plinktwo)

return false;

}

另外一種方法就是計數的方法,既然鍊錶在某處重合,那麼此點訪問的次數就是2,所以我們可以依次把兩個鍊錶遍歷一下,最後檢視有沒有節點的count為2即可。

typedef struct _link_node

link_node;

void process_all_link_node(link_node* pnode)

}

從計數的方法,我們可以發現如果兩個鍊錶是重合的,那麼他們的最後乙個節點必然是相同的,所以只要判斷最後乙個節點是否相同即可。

status find_if_link_merge(link_node* plinkone, link_node* plinktwo)

總結:1)鍊錶重合的題目雖然簡單,但是從不同的角度可以有不同的答案;

2)本題目來自《程式設計之美》, 如果對解法還有興趣的朋友可以參考《程式設計之美》。

一步一步寫演算法(之鍊錶重合)

原文 一步一步寫演算法 之鍊錶重合 鍊錶重合是乙個好玩的問題。原題目是這樣的 有兩個鍊錶,那麼如何判斷這兩個鍊錶是不是重合的?至於這個鍊錶在什麼時候重合的,這不重要,關鍵是判斷這個鍊錶究竟有沒有重合。究竟有什麼方法呢?最簡單的方法就是檢視兩者有沒有共同點。那麼依次判斷就行了。int find nod...

一步一步寫演算法(之鍊錶排序)

相比較線性表的排序而言,鍊錶排序的內容稍微麻煩一點。一方面,你要考慮資料插入的步驟 另外一方面你也要對指標有所顧慮。要是有一步的內容錯了,那麼作業系統會馬上給你彈出乙個exception。就鍊錶的特殊性而言,適合於鍊錶的排序有哪些呢?1 插入排序 適合 2 氣泡排序 適合 3 希爾排序 適合 4 選...

一步一步寫演算法(之鍊錶逆轉)

鍊錶逆轉是面試環境中經常遇到的一道題目,也是我們在實際開發中可能會遇到的開發需求。和線性逆轉不一樣,單向鍊錶的節點需要乙個乙個進行處理。為了顯示兩者之間的區別,我們分別對線性記憶體和鍊錶進行逆 1 普通連續記憶體資料的反轉分析 cpp view plain copy status normal re...