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

设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为
问答题
给出算法的基本设计思想。
【正确答案】 ①分别求出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指向同一结点,则该点即为所求的共同后缀的起始位置。
【答案解析】
问答题
根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
【正确答案】算法实现:
typedef struct Node{
char data;
struct Node*next;
}SNODE;
SNODE*findlist(SNODE*str1,SNODE*str2){
int m,n;
SNODE*P,*q;
m=listlen(str1); /*求str1的长度。O(m)*/
n=listlen(str2); /*求str2的长度。O(n)*/
/*以下3个循环的时间复杂度为:O(max(m,n))*/
for(P=str1;m>n;m--) /*使P指向的链表与q指向的链表等长*/
P=P->next;
for(q=str2;m<n;n--) /*使q指向的链表与P指向的链表等长*/
q=q->next;
while(p->next!=NULL&&p->next!=q->next){
/*查找共同后缀起始点*/
p=p->next; /*两个指针同步向后移动*/
q=q->next;
}
return p->next; /*返回共同后缀的起始点*/
}
int listlen(SNODE*head){ /*求链表长度*/
int len=0;
while(head->next!=NULL){
len++;
head=head->next;
}
return len;
}
【答案解析】
问答题
说明你所设计算法的时间复杂度。
【正确答案】时间复杂度为:O(m+n)或O(max(m,n))。其中m、n分别为两个链表的长度。
【答案解析】