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:

 1 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {

 2         //算法1:假设链表无环,对齐A,B链表

 3         ListNode * pa = headA;

 4         ListNode * pb = headB;

 5         int lengthA = 0, lengthB = 0;

 6         while ( pa )

 7         {

 8             pa = pa->next;

 9             lengthA++;

10         }

11         while ( pb )

12         {

13             pb = pb->next;

14             lengthB++;

15         }

16         

17         ListNode * pLong = NULL;

18         ListNode * pShort = NULL;

19         pLong = (lengthA >= lengthB)?headA:headB;

20         pShort = (lengthA < lengthB)?headA:headB;

21         //对齐两个链表

22         for ( int i = 0; i < abs(lengthA-lengthB); i++ )

23         {

24             pLong = pLong->next;

25         }

26         

27         while (pShort)

28         {

29             if (pShort == pLong)

30             {

31                 return pShort;

32             }

33             else

34             {

35                 pShort = pShort->next;

36                 pLong = pLong->next;

37             }

38         }

39         return NULL;

40     }

 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     }

 

你可能感兴趣的:(intersect)