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     }

 

posted @ 2015-06-22 09:48  Rosanne  阅读(164)  评论(0编辑  收藏  举报