-
题目地址: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
****************************************************************/