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 }