输入两个链表,找出它们的第一个公共结点。
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数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 ****************************************************************/