题目

To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same sufix. For example, “loading” and “being” are stored as showed in Figure 1.

Input Specification:

Each input file contains one test case. For each case, the first line contains two addresses of nodes and a positive N (<= 105), where the two addresses are the addresses of the first nodes of the two words, and N is the total number of nodes. The address of a node is a 5-digit positive integer, and NULL is represented

by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is the letter contained by this node which is an English letter chosen from {a-z, A-Z}, and Next is the position of the next node.

Output Specification:

For each case, simply output the 5-digit starting position of the common sufix. If the two words have no common sufix, output “-1” instead.

Sample Input 1:

11111 22222 9

67890 i 00002

00010 a 12345

00003 g -1

12345 D 67890

00002 n 00003

22222 B 23456

11111 L 00001

23456 e 67890

00001 o 00010

Sample Output 1:

67890

Sample Input 2:

00001 00002 4

00001 a 10001

10001 s -1

00002 a 10002

10002 t -1

Sample Output 2:

-1

题目分析

两个链表,有共同后缀,找出共同后缀的第一个节点的地址

解题思路

思路01(最优)

  1. 定义Node结构体,记录每个节点信息(地址,data,next指针),用map记录映射关系<地址,节点>方便O(1)查找(可以使用大数组代替,下标及地址,元素值记录next)
  2. 遍历第一个链表,出现过的元素标记为1
  3. 遍历第二个链表,若其节点在第一个链表中出现过(即:标记=1),则打印,若链表2中没有在链表1中出现过的节点,打印-1

思路02

  1. 定义Node结构体,记录每个节点信息(地址,data,next指针),用map记录映射关系<地址,节点>方便O(1)查找(可以使用大数组代替,下标及地址,元素值记录next)
  2. 分别计算两个链表的长度
  3. 先遍历长链表到其长度跟短链表长度相等
  4. 同时遍历两个链表,找出相同节点,若有相同节点,打印其地址,若无相同节点,打印-1;

思路03(该思路错误,列出来为了下次不再这样思考)

1. 记录输入的每个样例的next,如果有next出现两次,即为相同节点(×);如果其中一个链表的起点是另一个链表的节点(即任意一个链表的起点在另外一个链表中出现过)(测试点2,4,5错误)

注:网上其他朋友有说 一个错误情况为格式,必须为5个字符

Code

Code 01

#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
struct node {
string adr;
char data;
string next;
bool flag=false;
};
int main(int argc,char * argv[]) {
string s1,s2;
int d;
char c;
node n;
cin>>s1>>s2>>d;
unordered_map<string,node> m; //用map最后一个点会超时
for(int i=0; i<d; i++) {
cin>>n.adr>>n.data>>n.next;
m[n.adr]=n;
} string n1=s1;
while(n1!="-1") {
m[n1].flag=true;
n1=m[n1].next;
} string n2=s2;
while(n2!="-1") {
if(m[n2].flag) {
break;
}
n2=m[n2].next;
}
printf("%s",n2.c_str());
return 0;
}

Code 02

#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
struct node {
string adr;
char data;
string next;
bool flag=false;
};
int main(int argc,char * argv[]) {
string s1,s2;
int d;
char c;
node n;
cin>>s1>>s2>>d;
unordered_map<string,node> m; //用map最后一个点会超时
for(int i=0; i<d; i++) {
cin>>n.adr>>n.data>>n.next;
m[n.adr]=n;
} int len1=0,len2=0;
string n1=s1;
while(n1!="-1") {
n1=m[n1].next;
len1++;
}
string n2=s2;
while(n2!="-1") {
n2=m[n2].next;
len2++;
} n1=s1,n2=s2;
while(len1>len2) {
len1--;
n1=m[n1].next;
}
while(len1<len2) {
len2--;
n2=m[n2].next;
}
while(n1!=n2){
n1=m[n1].next;
n2=m[n2].next;
}
printf("%s",n1.c_str());
return 0;
}

PAT Advanced 1032 Sharing(25) [链表]的更多相关文章

  1. PAT 甲级 1032 Sharing (25 分)(结构体模拟链表,结构体的赋值是深拷贝)

    1032 Sharing (25 分)   To store English words, one method is to use linked lists and store a word let ...

  2. 【PAT】1032 Sharing (25)(25 分)

    1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...

  3. PAT甲 1032. Sharing (25) 2016-09-09 23:13 27人阅读 评论(0) 收藏

    1032. Sharing (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To store Engl ...

  4. PAT甲题题解-1032. Sharing (25)-链表水题

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  5. PAT 1032 Sharing[hash][链表][一般上]

    1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...

  6. 1032 Sharing (25分)

    1032 Sharing (25分) 题目 思路 定义map存储所有的<地址1,地址2> 第一set存放单词1的所有地址(通过查找map) 通过单词二的首地址,结合map,然后在set中查 ...

  7. PAT (Advanced Level) 1032. Sharing (25)

    简单题,不过数据中好像存在有环的链表...... #include<iostream> #include<cstring> #include<cmath> #inc ...

  8. 1032 Sharing (25分)(数组链表)

    To store English words, one method is to use linked lists and store a word letter by letter. To save ...

  9. PAT 1032 Sharing (25分) 从自信到自闭

    题目 To store English words, one method is to use linked lists and store a word letter by letter. To s ...

随机推荐

  1. 【转】美团 MySQL 数据实时同步到 Hive 的架构与实践

    文章转载自公众号  美团技术团队 , 作者 萌萌 背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的 ...

  2. Java文件处理之IO流

    一.概述 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象 :其作用是为数据源和目的地建立一个输送通道. IO流:是程序中一套用于数据传输的机制.IO流是Input流和Outpu ...

  3. E. Third-Party Software - 2 贪心----最小区间覆盖

    E. Third-Party Software - 2 time limit per test 2.0 s memory limit per test 256 MB input standard in ...

  4. h5页面列表滚动加载数据

    h5列表滚动加载数据很常见,以下分享下今天做的案例: 前言 这个效果实现需要知道三个参数 1. scrollTop -- 滚动条距离顶部的高度 2. scrollHeight -- 当前页面的总高度( ...

  5. oracle函数创建与调用

    函数的定义: CREATE OR REPLACE FUNCTION FUNCTION_TEST(PARAMER1 IN VARCHAR, -- 参数的类型不写长度 PARAMER2 OUT VARCH ...

  6. CSS - input 美化

    input{ padding: 20px; width: 100%; height: 5vh; margin-bottom: 2vh; border-radius: 10vw; border: 0; ...

  7. 刷题之Implement strStr()、Climbing Stairs

    public class Solution { public int strStr(String haystack, String needle) { int big = haystack.lengt ...

  8. SQL中的LEFT/RIGHT/SUBSTRING函数

    语法: LEFT(field,length) RIGHT(field,length)SUBSTRING(field,start,length) LEFT/RIGHT函数返回field最左边/最右边的l ...

  9. 删除所有的docker容器和镜像(转载)

    列出所有的容器 ID docker ps -aq 停止所有的容器 docker stop $(docker ps -aq) 删除所有的容器 docker rm $(docker ps -aq) 删除所 ...

  10. Comet OJ - Contest #15(B: 当我们同心在一起 )

    题目链接 题目描述 平面上有 nn 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 nn 个点之中? 输入描述 第一行有一个正整数 nn 代表平面上的点数. 接下来有 nn  ...