查找两个单词链表共同后缀的起始结点

Posted 马甲全都掉了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找两个单词链表共同后缀的起始结点相关的知识,希望对你有一定的参考价值。

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

设str1和str2分别指向两个单词所在单链表的头结点,请实现一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置的结点,输出该结点对应的字符(如图中的字符i)

多组数据,每组数据有三行,第一行为链表str1和str2的长度n和m,第二行为链表str1的n个元素,第三行为链表str2的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。

对于每组数据输出一行,为共同后缀的起始位置结点对应的字符。

 复制
7 5
l o a d i n g
b e i n g
7 9
f l u e n c y
f r e q u e n c y
0 0
i
u

思路:找后缀起点->利用前插法将单词倒序存储,循环找到字母不一样的结点,前一个即为共同后缀的结尾。

#include<iostream>
using namespace std;

typedef struct Node
{
  char data;
  Node *next;
}*List;


void Create(List &L,int n)
{
  L=new Node;
  List p;
  L->next=NULL;

  for(int i=0;i<n;i++)
  {
    p=new Node;
    cin>>p->data;

    p->next=L->next;
    L->next=p;
  }

}//前插法

void Same(List &L1,List &L2)
{
  List p1=L1->next,p2=L2->next;
  char save;
  int i=0,flag=0;

  while(p1 && p2)
  {
    if(p1->data == p2->data)
    {
      save=p1->data;//如果值相同就保存下来

      p1=p1->next;
      p2=p2->next;
      flag=1;
    }
    else
      break;//循环直到值不同
  }

  if(flag==1)
    cout<<save<<endl;
}

int main()
{
  List L1,L2;
  int m,n;

  while(1)
  {
    cin>>m>>n;
    if(m==n && n==0)
    break;

    Create(L1,m);
    Create(L2,n);

    Same(L1,L2);

  }
    return 0;
}

 

以上是关于查找两个单词链表共同后缀的起始结点的主要内容,如果未能解决你的问题,请参考以下文章

PTA数据结构链表共享后缀的链表

拿捏链表—— 相交链表

用后缀树查找两个单词中最长的子串

基础实验3-2.3 共享后缀的链表 (25分)

剑指offer 36.时间空间效率的平衡两个链表的第一个公共结点

数据结构与算法—— * 双向链表 *