剑指Offer - 九度1505 - 两个链表的第一个公共结点
2013-11-24 20:09
- 题目描述:
-
输入两个链表,找出它们的第一个公共结点。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数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
题意分析:
给定两条链表,如果有公共节点的话,请找出,否则打印“My God”。这题本身出的有问题,如果两条单链表有一个公共节点的话,那应该指的是共用同一个节点,即指向同一个内存地址。如果两链表相交于一点,那么之后的部分都完全一样了。这题由于输入的数据是两组单独的数据,因此构造出来的两条链表在内存的范畴上肯定是不相交的。只能判断两者尾巴上的数据是否一致。
下面是思路:对于长度为m,n的两条链表,如果相交于某一点,那么之后的所有数据都必须一一相等。因此定义指针p1、p2指向链表1和2的表头,先将较长链表的指针移动到与短链表对齐的位置。然后逐个检查两两节点是否相等。如果当前节点相等,则表示此节点可能是“第一个公共节点”,然后从此节点往后移动逐个检查后面的节点是否全部对应相等。如果全部相等,则此节点就是公共节点,否则不相等的节点往后一个开始继续找答案。
这题的问题在于俩链表的公共节点应该是内存地址相同,而不是值相等。否则也就不好定义“公共”了。
1 // 654279 zhuli19901106 1505 Accepted 点击此处查看所有case的执行结果 1024KB 2044B 70MS 2 // 201311202124 3 #include <cstdio> 4 using namespace std; 5 6 struct ListNode{ 7 int val; 8 struct ListNode *next; 9 ListNode(int _val = 0): val(_val), next(NULL){} 10 }; 11 12 void delete_list(ListNode *head) 13 { 14 if(head == NULL){ 15 return; 16 } 17 18 ListNode *ptr; 19 20 while(head != NULL){ 21 ptr = head; 22 head = head->next; 23 delete ptr; 24 } 25 } 26 27 int main() 28 { 29 ListNode *h1, *h2, *p1, *p2, *cp1, *cp2; 30 int m, n; 31 int tmp; 32 int i; 33 34 while(scanf("%d%d", &m, &n) == 2){ 35 h1 = h2 = NULL; 36 p1 = p2 = NULL; 37 for(i = 0; i < m; ++i){ 38 scanf("%d", &tmp); 39 if(p1 == NULL){ 40 h1 = new ListNode(tmp); 41 p1 = h1; 42 }else{ 43 p1->next = new ListNode(tmp); 44 p1 = p1->next; 45 } 46 } 47 for(i = 0; i < n; ++i){ 48 scanf("%d", &tmp); 49 if(p2 == NULL){ 50 h2 = new ListNode(tmp); 51 p2 = h2; 52 }else{ 53 p2->next = new ListNode(tmp); 54 p2 = p2->next; 55 } 56 } 57 58 if(h1 == NULL || h2 == NULL){ 59 printf("My God "); 60 }else{ 61 p1 = h1; 62 p2 = h2; 63 if(m < n){ 64 for(i = 0; i < n - m; ++i){ 65 p2 = p2->next; 66 } 67 }else{ 68 for(i = 0; i < m - n; ++i){ 69 p1 = p1->next; 70 } 71 } 72 73 while(p1 != NULL && p2 != NULL && p1->val != p2->val){ 74 p1 = p1->next; 75 p2 = p2->next; 76 } 77 /* 78 cp1 = p1; 79 cp2 = p2; 80 while(cp1 != NULL && cp2 != NULL){ 81 if(cp1->val != cp2->val){ 82 break; 83 }else{ 84 cp1 = cp1->next; 85 cp2 = cp2->next; 86 } 87 } 88 if(cp1 != NULL && cp2 != NULL){ 89 // mismatch found here, move forward 90 p1 = cp1->next; 91 p2 = cp2->next; 92 }else{ 93 break; 94 } 95 */ 96 97 if(p1 != NULL && p2 != NULL && p1->val == p2->val){ 98 printf("%d ", p1->val); 99 }else{ 100 printf("My God "); 101 } 102 } 103 104 delete_list(h1); 105 h1 = NULL; 106 delete_list(h2); 107 h2 = NULL; 108 } 109 110 return 0; 111 }