剑指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\n");
 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\n", p1->val);
 99             }else{
100                 printf("My God\n");
101             }
102         }
103         
104         delete_list(h1);
105         h1 = NULL;
106         delete_list(h2);
107         h2 = NULL;
108     }
109     
110     return 0;
111 }

 

 posted on 2013-11-24 20:26  zhuli19901106  阅读(247)  评论(0编辑  收藏  举报