【九度】题目1505:两个链表的第一个公共结点

108 篇文章 0 订阅
102 篇文章 5 订阅
题目地址:http://ac.jobdu.com/problem.php?pid=1505
题目描述:

输入两个链表,找出它们的第一个公共结点。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数。
接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开。第二行为第二个链表的所有元素,中间用空格隔开。

输出:

对应每个测试案例,
输出两个链表的第一个公共结点的值。
如果两个链表没有公共结点,则输出“My God”。

样例输入:
5 4
1 2 3 6 7
4 5 6 7
3 3
1 5 7
2 4 7
2 3
1 3
4 5 6
样例输出:
6
7
My God

我想多了,其实只要两个链表的某个节点相同就输出。并不是求共同后缀。。。
这个题目的意思应该是求交叉节点。
用的是暴力搜索。
如果两个链表有公共节点的话,可以同时遍历ab两个链表。
在遍历之前,需要将两个链表的长度处理成一样的。否则会出错。
我感觉应该有更好的办法,如果后续实现了更好的方式,再更新代码。

C++ AC

#include <stdio.h>
#include <malloc.h>
struct LinkedNode{
    int data;
    struct LinkedNode *next;
};
 
int n,m,i;
 
int main(){
    LinkedNode *nodeA,*nodeB,*tail,*p,*q;
    while(scanf("%d%d",&m,&n) != EOF){
        nodeA = (LinkedNode*)malloc(sizeof(LinkedNode));
        nodeA->next = NULL;
        tail = nodeA;
        for(i = 0; i < m; i++){
            int data;
            scanf("%d",&data);
            p = (LinkedNode*)malloc(sizeof(LinkedNode));
            p->data = data;
            tail->next = p;
            tail = p;
        }
        tail-> next = NULL;
 
        nodeB = (LinkedNode*)malloc(sizeof(LinkedNode));
        nodeB->next = NULL;
        tail = nodeB;
        for(i = 0; i < n; i++){
            int data;
            scanf("%d",&data);
            p = (LinkedNode*)malloc(sizeof(LinkedNode));
            p->data = data;
            tail->next = p;
            tail = p;
        }
        tail-> next = NULL; 
        p = nodeA->next;
        q = nodeB->next;
        int k = 0;
        if (m > n) {
            while (k < m-n) {
                p = p->next;
                k++;
            }
        }else if (m < n) {
            k = 0;
            while (k < n-m) {
                q = q->next;
                k++;
            }
        }
        int result ;
        bool flag = false;
        while (p != NULL && q != NULL ) {
            int num1 = p->data;
            int num2 = q->data;
            if (num1 == num2) {
                result = num1;
                flag = true;
                break;
            }
            p = p->next;
            q = q->next;
        }
              
        if (p != NULL) {
            flag = true;
            result = p->data;
        }
        if (!flag) {
            printf("%s\n","My God");
        }else {
            printf("%d\n",result);
        }
    }
    return 0;
}
/**************************************************************
    Problem: 1505
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:70 ms
    Memory:3924 kb
****************************************************************/

Java AC

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
   
public class Main {
    /*
     * 1505 
     * ===我想多了,其实只要两个链表的某个节点相同就输出。并不是求共同后缀。。。
     * ===这个题目的意思应该是求交叉节点。
     */
    public static void main(String[] args) throws Exception {
        StreamTokenizer st = new StreamTokenizer(
                new BufferedReader(new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int m = (int) st.nval;
            st.nextToken();
            int n = (int) st.nval;
            if (m == 0 && n == 0) {
                System.out.println("My God");
                continue;
            }
            LinkedNode nodeA = null;
            LinkedNode pointA = null;
            if (m > 0) {
                st.nextToken();
                nodeA = new LinkedNode((int)st.nval , null);
                pointA = nodeA;
                for (int i = 1; i < m; i++) {
                    st.nextToken();
                    LinkedNode tempNode = new LinkedNode((int)st.nval , null);
                    pointA.setNext(tempNode);
                    pointA = pointA.getNext();
                }
            }
            LinkedNode nodeB = null;
            LinkedNode pointB = null;
            if (n > 0) {
                st.nextToken();
                nodeB = new LinkedNode((int) st.nval ,null);
                pointB = nodeB;
                for (int i = 1; i < n; i++) {
                    st.nextToken();
                    LinkedNode tempNode = new LinkedNode((int) st.nval ,null);
                    pointB.setNext(tempNode);
                    pointB = pointB.getNext();
                }
            }
               
            pointA = nodeA;
            pointB = nodeB;
            int k = 0;
            Integer result = null;
            if (m > n) {
                while (k < m-n) {
                    pointA = pointA.getNext();
                    k++;
                }
            }else if (m < n) {
                k = 0;
                while (k < n-m) {
                    pointB = pointB.getNext();
                    k++;
                }
            }
            while (pointA != null && pointB != null ) {
                int num1 = pointA.getData();
                int num2 = pointB.getData();
                if (num1 == num2) {
                    result = num1;
                    break;
                }
                pointA = pointA.getNext();
                pointB = pointB.getNext();
            }
               
            if (pointA != null) {
                result = pointA.getData();
            }
            if (result == null ) {
                System.out.println("My God");
            }else {
                System.out.println(result);
            }
        }
    }
    static class LinkedNode{
        private int data;
        private LinkedNode next;
        public int getData() {
            return data;
        }
        public void setData(int data) {
            this.data = data;
        }
        public LinkedNode getNext() {
            return next;
        }
        public void setNext(LinkedNode next) {
            this.next = next;
        }
        public LinkedNode(int data, LinkedNode next) {
            super();
            this.data = data;
            this.next = next;
        }
    }
       
}
/**************************************************************
    Problem: 1505
    User: wzqwsrf
    Language: Java
    Result: Accepted
    Time:940 ms
    Memory:27696 kb
****************************************************************/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值