题目:
分析:时间上高效,说明可能存在空间换时间的算法。
思路一:双重循环
思考:双重遍历找到共同后缀的起始位置。按照这种思路输入的数据必需保证共同后缀的地址是相同的。自己处理有点麻烦,所以没写完整的可运行代码。至于NULL的情况应该是没有的,题目应该是保证一定存在后缀。加NULL是为了严谨一些。
node* check(list str1,list str2)
{
node*p,*q;
p=str1->next;//指向头结点
while(p!=NULL)
{
q=str2->next;
while(q!=NULL)
{
if(p==q)
return p;
q=q->next;
}
p=p->next;
}
return NULL;//没找到的情况
}
时间复杂度:O(len1*len2),空间复杂度O(1)len1为str1所指链表长度,len2为str2所指长度。
思路二:假设空间换时间后优化
思考:题目说时间上高效已经提示可能存在空间换时间的思路。假设存在,我们可以想到把两条链表放到数组里,然后让数组进行尾对齐。假设len2>len1,那么当len2遍历到len2-len1的时候,就能很容易找到共同后缀。这时候突然发现,不需要开额外空间好像也是可以的!最重要的东西其实是len2和len1两个变量。
node* check(list str1,list str2)
{
node*p,*q;
p=str1->next;
q=str2->next;
int len1=0,len2=0;
//求长度
while(p!=NULL) len1++,p=p->next;
while(q!=NULL) len2++,q=q->next;
//移动,尾对齐
for(q=str2->next;len2>len1;len2--) q=q->next;
for(p=str1->next;len2<len1;len1--) p=p->next;
while(p->next!=q->next&&p->next!=NULL)
{
p=p->next;
q=q->next;
}
return p;//起始点
}