zoukankan      html  css  js  c++  java
  • Intersection of Two Linked Lists

    Description:

    Write a program to find the node at which the intersection of two singly linked lists begins.

    For example, the following two linked lists:

    A:          a1 → a2
                       ↘
                         c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3
    

    begin to intersect at node c1.

     

    Notes:

      • If the two linked lists have no intersection at all, return null.
      • The linked lists must retain their original structure after the function returns.
      • You may assume there are no cycles anywhere in the entire linked structure.
      • Your code should preferably run in O(n) time and use only O(1) memory.

    Code1:

      ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
              //算法1:假设链表无环,对齐A,B链表
              ListNode * pa = headA;
              ListNode * pb = headB;
              int lengthA = 0, lengthB = 0;
              while ( pa )
              {
                  pa = pa->next;
                  lengthA++;
             }
             while ( pb )
             {
                 pb = pb->next;
                 lengthB++;
             }
             
             ListNode * pLong = NULL;
             ListNode * pShort = NULL;
             pLong = (lengthA >= lengthB)?headA:headB;
             pShort = (lengthA < lengthB)?headA:headB;
             //对齐两个链表
             for ( int i = 0; i < abs(lengthA-lengthB); i++ )
             {
                 pLong = pLong->next;
             }
             
             while (pShort!=pLong && pShort!=NULL && pLong != NULL)
             {
                     pShort = pShort->next;
                     pLong = pLong->next;
                 }
             }
             return pShort;
         }

     Code2:利用栈实现逆向访问链表

     1  ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     2        stack<ListNode*>a;
     3        stack<ListNode*>b;
     4        ListNode* p = headA;
     5        ListNode* q = headB;
     6        while (p)
     7        {
     8            a.push(p);
     9            p = p->next;
    10        }
    11        while (q)
    12        {
    13             b.push(q);
    14             q = q->next;
    15        }
    16        ListNode* lastNode = NULL;
    17        while ( !a.empty() && !b.empty() )
    18        {
    19            if (a.top() != b.top())
    20            {
    21                return lastNode;
    22            }
    23            else
    24            {
    25                lastNode = a.top();
    26                a.pop();
    27                b.pop();
    28            }
    29        }
    30        return lastNode;
    31     }
  • 相关阅读:
    转 TClientDataSet的地位
    让Delphi的DataSnap发挥最大效率
    Delphi2010强化的反射
    Delphi的内存管理及内存泄露问题
    DataSnap 传输过滤器
    delphi dataset not in edit or insert mode
    CSS中Zoom属性的一些介绍
    Linux进程分析
    MIPS处理器介绍
    Linux内存管理
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4592923.html
Copyright © 2011-2022 走看看