A1032-Sharing

ac 思路:还是按数组存,然后遍历第一条链表,置flag为1,然后遍历第二条,若能找到flag为1的就是有公共的。
其实本质上都是一样的,注意遍历的思想

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;

struct Node
{
    int add,next;
    char data;
    int flag;
}node[maxn];

int main()
{
    int start1,start2,N;
    for(int i=0;i<maxn;i++)
        node[i].flag=0; 
    scanf("%d %d %d",&start1,&start2,&N);
    int address;
    int p;
    for(int i=0;i<N;i++)
    {
        scanf("%d ",&address);
        scanf("%c %d",&node[address].data,&node[address].next);
        node[address].add=address;
    }
    for(p=start1;p!=-1;p=node[p].next)
        node[p].flag=1;
    for(p=start2;p!=-1;p=node[p].next)
    {
        if(node[p].flag==1)
        {
            printf("%05d",node[p].add);
            break;
        }       
    }
    if(p==-1)
        printf("-1");   
    return 0;
 } 

没ac思路,鉴于1074的思想把我成功带偏,想的很复杂,但是有一个点过不去,想不通,思路是把两条链表都排出来,然后从后向前比较,显然很费劲。

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;

struct Node
{
    int add,next;
    char data;
    int order;
}node1[maxn],node2[maxn];
bool cmp(Node a,Node b)
{
    return a.order<b.order;
}
int main()
{
    int start1,start2,N;
    for(int i=0;i<maxn;i++)
    {
        node1[i].order=maxn;
        node2[i].order=maxn;
    }       
    scanf("%d %d %d",&start1,&start2,&N);
    int address;
    for(int i=0;i<N;i++)
    {
        scanf("%d ",&address);
        scanf("%c %d",&node1[address].data,&node1[address].next);
        node2[address].add=node1[address].add=address;
        node2[address].data=node1[address].data;
        node2[address].next=node1[address].next;
    }
    int link1=start1,link2=start2;
    int count1=0,count2=0;
    while(link1!=-1)
    {
        node1[link1].order=count1++;
        link1=node1[link1].next;
    } 
    while(link2!=-1)
    {
        node2[link2].order=count2++;
        link2=node2[link2].next;
    } 
    sort(node1,node1+maxn,cmp);
    sort(node2,node2+maxn,cmp);
    int n1=count1-1,n2=count2-1;
    int flag=0;
    while(n1>=0&&n2>=0)
    {
        if(node1[n1].add==node2[n2].add)
        {
            n1--;n2--;
            flag=1;
        }
        else
        {
            if(flag)    
                printf("%05d",node1[n1].next);
            else
                printf("-1");
            break;
        }       
    }
    if(n1==-1||n2==-1)
    {
        if(n1==-1)
            printf("%05d",start1);
        else
            printf("%05d",start2);      
    }
    return 0;
 } 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 10,052评论 1 45
  • 1. 数组 1.1 删除 题解题思路26. 删除排序数组中的重复项[https://leetcode-cn.com...
    王龙江_3c83阅读 2,338评论 0 0
  • 链表:数据存储结构我们通过一个简单的场景,了解一下链表的数据存储结构。那就是LRU缓存淘汰算法。 缓存是一种提高数...
    初心myp阅读 3,843评论 0 1
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 5,314评论 1 3
  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 8,823评论 4 74