zoukankan      html  css  js  c++  java
  • 剑指Offer

    剑指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 }
  • 相关阅读:
    利用Redis和Flask维护一个通用爬虫代理池
    在scrapy_splash中加载本地Cookies
    Splash对接Scrapy
    Selenium和pymongo的简单复习
    Scrapy框架
    web.xml is missing and <failOnMissingWebXml> is set to true
    深入Mybatis配置文件
    SSH和SSM的比较
    classpath路径指什么
    数据库范式
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3440428.html
Copyright © 2011-2022 走看看