描述

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

思路:

看题目的意思是已经把问题简化了,给的两个单词的后缀一定是一样的,不会出现一个的后缀包含另一个的后缀的情况——也就是类似于

kianana
kianame

的情况,同时,经过测试,

1 1
i i
0 0

这样的极端情况也没有测到。 不过其实是应该考虑到的Hiahia~

思路:

这个题我用的单链表,如果是单链表的话用头插法比较好,因为头插法不用去考虑上文提到的kianana那个测试用例;而且已知结尾的一串字符肯定是一一对应的了,所以也不用考虑如果两个单词不一样长的话在遍历的时候“一个快一个慢”的问题,就相当于尾部对齐。总之我认为头插法对于单链表是最佳选择。

Find函数我直接传的是首元节点,而且这是一次性遍历,已经比较过的节点就不用管了,所以也不用再来一个p->next了。

Find函数里,用t来保存第一次传进来的首元节点的data,写在一开始是为了初始化这个string,后边循环的时候会改变。temp用来保存要输出的那个字母。

下面模拟一下循环过程,以

7 5
l o a d i n g
b e i n g

为例。

1.0  t=g

1.1  l1->data==l2->data=g,  temp=l1->data=g

1.2   t=g

1.3     l1 = l1->next;
          l2 = l2->next;

2.1  temp=l1->data=n

2.2  t=l1->data=n

2.3   l1 = l1->next;
        l2 = l2->next;

3.1  temp=l1->data=i

3.2  t=l1->data=i

3.3   l1 = l1->next;
        l2 = l2->next;

4.1  temp=t=i

4.2  cout<<temp<<endl;break;

当然用双向链表的话输出的时候就比较简单了,用prior就能轻松找到要输出的值了~

#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
typedef struct LNode
{string data;LNode* next;}*linklist, LNode;
void TInsert(linklist& l, int n)
{l = new LNode;l->next = NULL;for (int i = 0; i < n; i++){linklist p = new LNode;cin >> p->data;p->next = l->next;l->next = p;}
}
void Find(linklist l1, linklist l2)
{string t = l1->data;while (l1 && l2){string temp = l1->data == l2->data ? l1->data :t ;if ((l1->data != l2->data)|| (l1->next == NULL && l2->next == NULL)){cout << temp << endl;break;}t = l1->data;l1 = l1->next;l2 = l2->next;}
}
int main()
{int n1,n2;cin >> n1>>n2 ;while (n1&&n2){linklist s1,s2;TInsert(s1,n1);TInsert(s2, n2);Find(s1->next, s2->next);cin >> n1 >> n2;}return 0;
}

双向链表代码如下,1 1 i i那个用例也可以输出正确的值(虽然系统没卡这个吧=v=)

#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
typedef struct LNode
{string data;LNode* next;LNode* prior;
}*linklist, LNode;
void TInsert(linklist& l, int n)
{l = new LNode;l->next = NULL;cin >> l->data;linklist head = l;for (int i = 1; i < n; i++){linklist p = new LNode;cin >> p->data;p->next = head;head->prior = p;head = p;}l->next = head;head->prior = l;
}
void Find(linklist l1, linklist l2)
{while (l1 && l2){string temp = l1->data == l2->data ? l1->data :l1->prior->data;if ((l1->data != l2->data) || (l1->next == l1 && l2->next == l2))//这里不能再写==NULL了~{cout << temp << endl;break;}l1 = l1->next;l2 = l2->next;}
}
int main()
{int n1,n2;cin >> n1>>n2 ;while (n1&&n2){linklist s1,s2;TInsert(s1,n1);TInsert(s2, n2);Find(s1->next, s2->next);cin >> n1 >> n2;}return 0;
}

查找两个单词链表共同后缀的起始结点(C++,单链表/双向链表解法)相关推荐

  1. 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表)

    目录 一.链表(链式存储结构)的特点 二.单链表的定义和表示 1.带头结点的单链表 2.单链表的存储结构 三.单链表基本操作的实现 1.单链表的初始化(带头结点的单链表) 2.补充单链表的几个常用简单 ...

  2. 【带头结点的单链表】

    带头结点的单链表 前言 一.带头结点的单链表结构体设计 1. 带头结点的单链表 2. 结构体声明 二.函数实现 1. 初始化 2. 申请新节点 3. 头插 4. 尾插 5. 按位置插入 6. 头删 7 ...

  3. 2.3 带头结点的单链表:理论+编程实战(C语言详细)

    1.顺序存储:线性表/栈/队列:理论+C语言实现–详细 2.1 链式存储概述 和 2.2 线性表的链式存储–单链表(C语言详细实现) 文章目录 2.3 带头结点的单链表 1. 带头结点的单链表基本概念 ...

  4. 建立带头结点的单链表

    [问题描述] 设有头结点单链表,实现单链表建立算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000): 第二行输入N个整数,以空格作为分隔,创建长度为N的单链表. [输出形式] 输出建立 ...

  5. java带头结点的单链表_自己实现集合框架 (五): 带头结点单链表的实现

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  6. 带头结点的单链表的初始化,建立,插入,查找,删除

    //带头结点的单链表的初始化,建立,插入,查找,删除     #include <stdio.h>     #include <stdlib.h> typedef int El ...

  7. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  8. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。

    [一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...

  9. (关于单链表的真题)已知一个带有表头结点的单链表...请设计一个尽可能高效的算法,查找链表中倒数第k个位置的结点。

    真题描述 已知一个带有表头结点的单链表,结点结构为 data next 假设该链表只给出了头指针head.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点. 若查找成 ...

最新文章

  1. 用awk数组处理两个文件的例子
  2. pandas把索引变成列
  3. Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
  4. MVP:界面与业务逻辑分离在Winform中的应用
  5. Archive object standard check
  6. python打乱list_超实用!每 30 秒学会一个 Python 小技巧,GitHub 标星 5300!
  7. gridview获取选中行数据_Word转Excel,不想熬夜加班,那就掌握这个数据清洗方法...
  8. SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)
  9. xugu clob字段如何导出_如何优雅的导出EXCEL
  10. Mac系统如何通过自带的工具进行磁盘修复
  11. django singal 信号量
  12. 【单目标优化求解】基于matlab粒子群混沌混合蝴蝶优化算法求解最优目标问题(HPSOBOA)【含Matlab源码 1538期】
  13. vue 在线预览word、excel、pdf、txt、图片
  14. oracle中聚合比较函数,Oracle 分析函数与聚合函数区别
  15. Android手机游戏大全apk
  16. 魔兽争霸的历史(ZT)第二章
  17. 敏感词过滤及反垃圾文本的相关知识(欢迎收藏)
  18. AD转换为KiCAD的方法
  19. 第2章 计算机图形系统概述
  20. echarts地图省份按顺序依次高亮demo(源码)

热门文章

  1. 计算机能帮助我学英语翻译,英语翻译以下几个句子,帮忙把汉语翻译成英语,请不要用软件翻!1、计算机能帮助人们从事复杂的计算.几十年前可能需要数月完成...
  2. CUDA并行计算 | CUDA算法效率提升关键点概述
  3. 第八章 数据结构与算法
  4. dede织梦数据表字段解释
  5. [Ogre][地形]OgreTerrain的实现原理分析
  6. 如何设置iMatrix平台中列表标签(gridjqGrid)实现动态列表
  7. Oracle BBED 工具介绍
  8. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面
  9. Leetcode-5148 Binary Tree Coloring Game(二叉树着色游戏)
  10. 互联网基础知识------OSI七层网络模型梗概