码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-11-06 00:55:22      阅读:436      评论:0      收藏:0      [点我收藏+]

标签:detail   后缀   names   cti   style   lag   头结点   color   flag   

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀空间。例如,“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;
}

 

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

标签:detail   后缀   names   cti   style   lag   头结点   color   flag   

原文地址:https://www.cnblogs.com/WuDiKzl/p/9912355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!