问答题 假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间。例如,“loading”和“being”的存储映像如下图所示。设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为
【正确答案】正确答案:找两个单词的共同后缀,应从两个单词的词尾向前找,找到最前边那个相同的字母,就找到了共同后缀。由于本题中单词以单链表存储,若想找到最后字母,需使用栈,这将增大空间复杂度。为不增大空间复杂度,可以先求出两个链表的长度m和n,让两个链表“尾对齐”,即长链表将指针移到|m一n+1|,短链表的指针指向链表的第一个字母,两个链表进行模式匹配:对应字母比较,从最后遇到两个链表结点值相等,直至到表尾对应结点值都相等为止。要注意处理虽然首次遇到对应结点值相等,但有后续结点值不等的情况,即在匹配中,并非一遇到对应字母相等,就结论后边是共同后缀。尾部对齐后比较的核心语句段如下: while(8) //长链表已移到两个链表尾部对齐的位置 (while(s&&8一>data !=q一>data) (s=s一>next; q=q一>next;) //找两个链表的可能共同后缀的第一个字母 p=s; //p指向两个链表共同后缀的起始位置 while(8&&s一>data==q一>data) {s=s一>next;q=q一>next;) //如对应字母相等两链表后移指针 } //返回两个链表共同后缀的起始位置p
【答案解析】