【2012统考真题】已知两字符串有共同后缀,返回共同后缀的起始位置。(长str的指针先走直到剩余部分和短str等长时两指针齐头并进直到p->next==q=>next,返回任意一个即可。)

23.【2012统考真题】假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,

可共享相同的后缀存储空间,例如,“loading”和“being”的存储映像如下图所示。

要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用C或C++或Java语言描述算法,送键之处给出注释条

3)说明你所设计算法的时间复杂度。

本题与2009年真题有相似之处,同样是找倒数第k个结点

  1. 算法思想:

比较两个字符串str1、str2,定义两个指向单链表结点的指针p,q分别初始指向各字符串的头节点(不是头节点的下一个位置,这里强调是头节点),让指向较长的str的指针先走,直到较长的str的剩余和短的str的全长相等时两指针开始同步前进,直到p->next==q->next停止循环,输出p->next结点

  1. 算法实现:(考试时写的代码片段)


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分别为两个链表的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值