題目
假定採用帶頭結點的單鏈表儲存單詞,當兩個單詞有相同的字尾時,可共享相同的儲存空間,例如,"loading"和"being"的儲存映像如下圖所示。
設str1
和str2
分別指向兩個單詞所在單鏈表的頭結點,鍊錶結點結構為
data
next
請設計乙個盡可能高效的演算法,找出由str1
和str2
所指向兩個單鏈表共同字尾的起始位置。
分析這其實是兩個鍊錶公共結點的問題;
兩個鍊錶有公共結點,即兩個鍊錶從某一結點開始,他們的next
都指向同乙個結點。有與每個單鏈表結點只有乙個next
域,因此從第乙個公共結點開始,之後他們所有的結點都是重合的,不可能再出現分叉,所以兩個有公共結點而部分重合的單鏈表,拓撲形狀看起來像yyy。
若兩個鍊錶有乙個公共結點,則該公共節點之後的所有結點都是重合的,及它們的最後乙個結點必然重合,因此,我們判斷兩個鍊錶是不是有重合的部分時,指向分別遍歷兩個鍊錶到最後乙個結點,若兩個尾結點是一樣的,則說明他們有公共結點,否則兩個鍊錶沒有公共結點。
注意,只有當兩個鍊錶同時遍歷到尾部時,才能判斷是否有公共部分,當兩個鍊錶長度不一致時,如la,
lb(l
a>lb
)la,lb(la>lb)
la,lb(
la>lb
),若有公共部分的話,公共部分的最大長度就是lblb
lb,而長鍊錶的前la−
lbla-lb
la−l
b部分不可能是公共部分,因此不用參加同步遍歷。
**
#include
#include
using
namespace std;
struct lnode
;lnode*
insert
(lnode &l, lnode *r,
char ch)
tmp-
>next = r-
>next;
r->next = tmp;
return tmp;
}int
listlen
(lnode l)
return len;
}lnode*
findaddr
(lnode str1, lnode str2)
return p;
}int
main()
總結
該演算法的時間複雜度為o(m
ax(l
a,lb
))o(max(la, lb))
o(max(
la,l
b))。
鍊錶 相交鍊錶的公共結點
題目描述 編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。解題思路 解題思路 我們使用兩個指標 node1,node2 分別指向兩個鍊錶 heada,headb 的頭結點,然後同時分別逐結點遍歷,當 node1 到達鍊錶 heada 的末尾時,重新定位到鍊錶 h...
兩個鍊錶的公共結點
輸入兩個鍊錶,找出他們的第乙個公共結點。鍊錶結點定義如下 1 struct listnode 2思想 我們可以先遍歷一次得到分別得到兩個鍊錶的長度,然後計算得出長度差n,那麼讓較長的鍊錶先走n步,然後兩個鍊錶一起向後走,直到兩個指標指向同乙個結點。這個結點就是我們要找的 結點。具體 如下 1 int...
兩個鍊錶的公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點 思路 如上圖所示,兩個鍊錶從第乙個公共結點開始,後面的所有結點都是重合的,並且不可能再出現分叉 思路一 在第乙個鍊錶上順序遍歷每個結點,每遍歷乙個結點,就在第二個鍊錶上順序遍歷每個結點,直到找到第乙個公共結點。時間複雜度為o mn 思路二 首先計算出...