链表节点链表相交(及相交的节点)、判断链表是否有环问题

发一下牢骚和主题无关:

    给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否订交。

    

    struct Node { int data; int Node *next; }; // if there is no cycle. int isJoinedSimple(Node * h1, Node * h2) { while (h1->next != NULL) { h1 = h1->next; } while (h2->next != NULL) { h2 = h2-> next; } return h1 == h2; } // if there could exist cycle int isJoined(Node *h1, Node * h2) { Node* cylic1 = testCylic(h1); Node* cylic2 = testCylic(h2); if (cylic1+cylic2==0) return isJoinedSimple(h1, h2); if (cylic1==0 && cylic2!=0 || cylic1!=0 &&cylic2==0) return 0; Node *p = cylic1; while (1) { if (p==cylic2 || p->next == cylic2) return 1; p=p->next->next; cylic1 = cylic1->next; if (p==cylic1) return 0; } } Node* testCylic(Node * h1) { Node * p1 = h1, *p2 = h1; while (p2!=NULL && p2->next!=NULL) { p1 = p1->next; p2 = p2->next->next; if (p1 == p2) { return p1; } } return NULL; }

    

链表无环求订交链表的第一个共同节点

    

解决方案:

    方法1:利用两次循环

    每日一道理
成熟是一种明亮而不刺眼的光辉,一种圆润而不腻耳的音响,一种不需要对别人察颜观色的从容,一种终于停止了向周围申诉求告的大气,一种不理会哄闹的微笑,一种洗刷了偏激的淡漠,一种无须声张的厚实,一种并不陡峭的高度。

    方法2:标记已访问的节点

    方法3:利用A和B节点数目之差

       

    

    

1)计算出链表A的节点数目,记做c1;

    

2)计算出链表B的节点数目,记做c2;

    

3)算出节点数目之差:d = abs(c1 - c2);

    

4)当初从节点数较多的链表开始,从头往前走过d个节点,从此节点往前走,两个链表有雷同数目的节点。

    

5)此时我们可以同时遍历两个链表直到找到一个交点。

    

这个算法的复杂度是O(m+n),是推荐使用的方法。

文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
  波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
  波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”

--------------------------------- 原创文章 By 链表和节点 ---------------------------------

posted @ 2013-05-23 20:07  xinyuyuanm  阅读(256)  评论(0编辑  收藏  举报