題目
假定採用帶頭結點的單鏈表儲存單詞,當兩個單詞有相同的字尾時,可共享相同的儲存空間,例如,"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 思路二 首先計算出...