23.【2012统考真题】假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,
可共享相同的后缀存储空间,例如,“loading”和“being”的存储映像如下图所示。
要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C或C++或Java语言描述算法,送键之处给出注释条
3)说明你所设计算法的时间复杂度。
本题与2009年真题有相似之处,同样是找倒数第k个结点
算法思想:
比较两个字符串str1、str2,定义两个指向单链表结点的指针p,q分别初始指向各字符串的头节点(不是头节点的下一个位置,这里强调是头节点),让指向较长的str的指针先走,直到较长的str的剩余和短的str的全长相等时两指针开始同步前进,直到p->next==q->next停止循环,输出p->next结点
算法实现:(考试时写的代码片段)
typedef struct SNode
{
char data;
SNode* next;
}SNode,*Slist;
int getlen(Slist& head)
{
int len = 0;
while (head->next != NULL)
{
len++;
head = head->next;
}
return len;
}
SNode* find_addr(Slist& str1, Slist& str2)
{
int m, n;
SNode* p, *q;
m = getlen(str1);
n = getlen(str2);
for (p = str1; m > n; m--)//其实这里外层套了一个if(m>n),但是和循环条件可以合并,故省略
p = p->next;
for (q = str2; m < n; n--)
q = q->next;
while (p->next != NULL && p->next != q->next)//省略条件p->next!=NULL||q->next!=NULL,因为两者此时等价,还等价于单独的其中一个
{
p = p->next;
q = q->next;
}
return p->next;
}
3.算法时间复杂度分析:
O(len1+len2)或O(max(len1,len2)),其中len1、len2分别为两个链表的长度。