zoukankan      html  css  js  c++  java
  • 面试题-----判断两个无环单链表是否交叉,如果交叉返回交叉点

    两个单链表交叉只能是Y型,所以可以通过判断最后一个节点是否为同一个节点来判断是否交叉

    bool IsCross(Node *head1, Node *head2)
    {
         if (!head1 || !head2) {
             return false;
         }
         
         Node *p1 = head1;
         Node *p2 = head2;    
         while (p1->next) {
             p1 = p1->next;
         }
         while (p2->next) {
             p2 = p2->next;
         }
         
         return (p1 == p2);
    }

    找出交点:遍历两个链表,记录长度分别为L1和L2,先让长的链表向后移动abs(L1-L2),然后在逐个比较结点,第一个相等的结点即为交点。

    Node *FindCross(Node *head1, Node *head2)
    {
         if (!head1 || !head2) {
             return NULL;
         }
         
         /* 求出两个链表的长度 */
         Node *p1, *p2;
         p1 = head1;
         p2 = head2;
         int len1, len2, len;
         len1 = len2 = 0;    
         while (p1) {
             len1++;
             p1 = p1->next;
         } 
         while (p2) {
             len2++;
             p2 = p2->next;
         }
         
         /* 将长链表先移动len个结点 */
         int i;
         len = abs(len1 - len2);
         p1 = head1;
         p2 = head2;
         if (len1 > len2) {
             for (i = 0; i < len; ++i) {
                 p1 = p1->next;
             }
         } else {
             for (i = 0; i < len; ++i) {
                 p2 = p2->next;
             }
         }
         
         /* 遍历 找到第一个相等的结点即为交点 */    
         while (!p1) {
             p1 = p1->next;
             p2 = p2->next;
             if (p1 == p2) {
                 return p1;
             }
         }
         
         return NULL; 
    }
  • 相关阅读:
    扑克牌顺子
    多任务Multitask Learning
    智能指针
    左旋转字符串
    和为s的两个数字
    07.极简主义读后感
    06.极简主义——汇流(笔记)
    05.极简主义——奉献(笔记)
    04.极简主义——热情(笔记)
    03.极简主义——人际关系(笔记)
  • 原文地址:https://www.cnblogs.com/qingergege/p/7825936.html
Copyright © 2011-2022 走看看