Write a program to find the node at which the intersection of two singly linked lists begins.
Notice
- 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.
Example
The following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
Challenge
Your code should preferably run in O(n) time and use only O(1) memory.
解法一:
1 class Solution { 2 public: 3 /** 4 * @param headA: the first list 5 * @param headB: the second list 6 * @return: a ListNode 7 */ 8 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 9 // write your code here 10 if(headA == NULL || headB == NULL) 11 return NULL; 12 ListNode* iter1 = headA; 13 ListNode* iter2 = headB; 14 int len1 = 1; 15 while(iter1->next != NULL) 16 { 17 iter1 = iter1->next; 18 len1 ++; 19 } 20 int len2 = 1; 21 while(iter2->next != NULL) 22 { 23 iter2 = iter2->next; 24 len2 ++; 25 } 26 if(iter1 != iter2) 27 return NULL; 28 if(len1 > len2) 29 { 30 for(int i = 0; i < len1-len2; i ++) 31 headA = headA->next; 32 } 33 else if(len2 > len1) 34 { 35 for(int i = 0; i < len2-len1; i ++) 36 headB = headB->next; 37 } 38 while(headA != headB) 39 { 40 headA = headA->next; 41 headB = headB->next; 42 } 43 return headA; 44 } 45 };