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

描述

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

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

输入

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

输出

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

样例输入1 复制

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

样例输出1

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;
}

 

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

时间: 2024-07-30 16:21:48

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

求两个单链表公共结点

题目:输入两个单链表,找出公共结点. 思路:若两个单链表有公共结点,其形状必定为"Y"型,也就是说公共结点后的所有结点都是相同的. 我们首先获得两个链表的长度,求得长度之差为n,再定义两个指针分别指向两个链表首部,长链表先走n步,然后两个指针同时走,直到两个指针所指向的值完全相同时停止. 代码: /* 求链表公共结点 */ #include<stdio.h> #include<stdlib.h> typedef struct _NODE_ { int data;

查找两个链表的交叉节点

1. 问题描述 给定两个单链表,查找这两个单链表的交叉节点.例如:链表listA为:a1→a2→c1→c2→c3,链表listB为:b1→b2→b3→c1→c2→c3.那么这两个的第一个交叉节点为c1. 2. 方法与思路 首先,观察一下交叉节点的特点.如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是Y字型的. 也就是说,c1之后的节点都是交叉节点.下面的问题就是如何确定c1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链

给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列

问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"] 返回 [ ["hit","hot",&

(算法)两个单词的最短距离

题目: 有个内含单词的超大文本,给定任意两个单词,找出这个文件中两个单词的最短距离. 思路: 通过两个两个变量来记录两个单词最后出现的位置,然后每次计算两者的距离,并更新最小距离. 假设需要重复查找任意两个单词的最短距离,则需要构造一个散列表,记录每个单词及其出现的位置.当查找某两个单词的最短距离时,只需找出该两单词所在列表差值最小的位置. 查找方法:可以将两个有序列表合并(列表元素包含位置及其所属单词,可以构造结构体). 代码: #include<iostream> #include<

9.判断两个单链表是否相交

9.判断两个单链表是否相交 注意这里是判断是否相交.对于判断问题来讲,相对还是比较简单的.注意单链表并非不能有重复元素. 思路1:O(len1*len2) 把第一个链表的指针值逐项存在hashtable中,遍历第2个链表的每一项的指针值,如果能在第一个链表中找到,则必然相交.但是C++的STL模板中的hash不太会用.所以我使用了set集合,不过貌似set集合是使用遍历的方式来查找元素是否在集合中的,所以效率是比较低的,至少在O(len1*len2)级别. bool judgeIntersect

判断两个单链表是否相交

题目描述: 给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false. 给定两个链表的头结点head1和head2.请返回一个bool值代表它们是否相交. 链表中节点的类型设置如下: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路: 1.首先判断是否有环, 若两个链表都没有环,则进行无环单链表判断是否相

单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)

typedef struct node//该结构体代表一个结点{ int data; //结点的数据域 struct node *next; //结点的指针域}lnode,*linklist; //定义一个结构体变量和指向结构体的指针//用头插法创建一个链表linklist create_begin(){ linklist head=(linklist)malloc(sizeof(lnode));//定义头结点并开辟空间 head->next=NULL; //为避免指针乱指,将头结点下一个指针赋

LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode21. Merge Two Sorted Lists 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 Java 实现 ListNode 类 class ListNode { int val; ListNode n

链表(14)----合并两个有序链表

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.合并两个有序链表 ListElement_t * MergeList( ListElement_t *