首页 > 试题广场 >

找出由str1 和 str2 所指的两个链表共同后缀的起始位

[问答题]
假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀空间,例如,“ loading” 和“ being” 的存储映像如下图所示。

设str1 和 str2 分别指向两个单词所在单链表的头结点,链表结点结构为 :

请设计一个时间上尽可能高效的算法,找出由str1 和 str2 所指的两个链表共同后缀的起始位置(如图中字符 i 所在结点的位置 p)。要求:

(1)给出算法的基本思想。
(2)根据设计思想,采用 C 或 C++或 Java 语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度。


(1)算法的基本设计思想如下:
① 分别求出 str1 和 str2 所指的两个链表的长度 m 和 n。
② 将两个链表表尾对其:令指针 p、 q 分别指向 str1 和 str2 的头结点,若 m≥n,则使 p 指向链表中的第 m-n+1 个结点;若 m<n,则使 q 指向链表中的第 n-m+1 个结点,即使指针 p、 q所指的结点到表尾的长度相等。

③ 反复将指针 p、 q 同步后移,并判断它们是否指向同一结点(通过比较结点地址是否相等,而不是比较结点值)。若 p、 q 指向同一结点,则该结点即为所求的共同后缀的起始位置。

(2)算法实现如下:
 



发表于 2016-11-19 16:44:20 回复(0)