資料結構 演算法設計題 鍊錶字尾共同空間

2021-10-20 18:53:26 字數 1892 閱讀 1989

採用帶頭結點的單鏈表儲存單詞,當兩個單詞有相同的字尾時,則可以共享相同的字尾儲存空間。例如,「loading」和「being」的儲存空間影像如圖。

設str1和str2分別指向兩個單詞所在鍊錶的頭結點,鍊錶結點結構為(data,next),請設計乙個時間上盡可能高效的演算法,找出由str1和str2所指的兩個鍊錶共同

字尾的起始位置。要求:

給出演算法的基本設計思想

說明演算法的時間複雜度。

因為兩個鍊錶長度不一定相同,所以從頭開始同時遍歷到尾結點,並不能保證同時到達。假設乙個鍊錶比另乙個長k個結點,將長鍊錶先移動k個位置,然後再與短鍊錶同時開始遍歷,檢查指標是否指向同乙個結點,如果是則為共同字尾的起始位置。

演算法分析

時間複雜度為o(m+n),空間複雜度為o(1)。

/*

採用帶頭結點的單鏈表儲存單詞,當兩個單詞有相同的字尾時,則可以共享相同的字尾儲存空間。例如,「loading」和「being」的儲存空間影像如圖。

設str1和str2分別指向兩個單詞所在鍊錶的頭結點,鍊錶結點結構為(data,next),請設計乙個時間上盡可能高效的演算法,找出由str1和str2所指的兩個鍊錶共同

字尾的起始位置。要求:

1. 給出演算法的基本設計思想

2. 說明演算法的時間複雜度。

*/#include

#include

using

namespace std;

typedef

struct lnode lnode,

*linklist;

void

createlist

(linklist &l, string s)

}void

printlist

(linklist l)

cout << endl;

}linklist findsuffix

(linklist l1, linklist l2)

tmp = p2;

while

(tmp)

// 計算表長之差,找出長str對應的鍊錶

int advance =0;

linklist longpoint, shortpoint;

if(len1 > len2)

else

// 長鍊表上遍歷advance個結點

while

(advance--

)// 同步遍歷兩個鍊錶,尋找共用儲存空間的位置

while

(longpoint)

else

}// 查詢失敗

return

null;}

inthassuffix

(string s1, string s2)

else}if

(ans >0)

else

}int

main()

else

// 接在l1和l2的後面

linklist p1 = l1;

while

(p1-

>next)

linklist p2 = l2;

while

(p2-

>next)

p1->next = head-

>next;

p2->next = head-

>next;

// printlist(l1);

// printlist(l2);

// 查詢字尾開始的結點

linklist findnode =

findsuffix

(l1, l2);if

(findnode ==

null

)else

}return0;

}

資料結構 演算法設計題 拆分鍊錶

設計演算法將乙個帶頭結點的單鏈表a分解為兩個具有相同結構的鍊錶b和c,其中b表的結點為a表中值小於零的結點,而c表中的結點為a表中值大於零的結點。鍊錶a中的元素為非零整數,要求b c表利用a表的結點。鍊錶b使用鍊錶a的頭結點,鍊錶c申請乙個新的頭結點。對鍊錶a進行遍歷的同時進行拆解,可以使用前插法或...

資料結構 演算法設計題 合併有序鍊錶2

將兩個非遞減的有序鍊錶合併成乙個非遞增的有序鍊錶。要求鍊錶仍使用原來兩個鍊錶的儲存空間,不另外使用其他的儲存空間,表中執行有重複的元素。與合併有序鍊錶1類似的思路,通過更改結點的指標域來重新建立元素之間的線性關係,得到新鍊錶。有兩個關鍵點 合併的鍊錶與原鍊錶順序相反,利用前插法建立鍊錶,形成遞減序列...

資料結構 演算法設計題 刪除連續序列鍊錶元素

設計乙個演算法,刪除遞增有序鍊錶中值大於mink且小於maxk的所有元素。找到小於等於mink的結點和大於等於maxk的結點,進行連線即可。設計乙個演算法,刪除遞增有序鍊錶中值大於mink且小於maxk的所有元素。include using namespace std typedef struct ...