我在discussion区的更新:C++-solutioneasy-to-understand
160. Intersection of Two Linked Lists
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.
My hints :
1、First walk two list entirely saperately,and get the length of the two list: lenA,lenB
2、n = lenA - lenB,and let the point_A go n step
3、then point_A,point_B go toghter,until point_A == point_B
My code:
个人感觉自己的思路更好理解,时间复杂度为m+n。(#^.^#)
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *p1 = headA; ListNode *p2 = headB; if (p1 == NULL || p2 == NULL) return NULL; int n1 = 0; int n2 = 0; int n = 0; while(p1 != NULL){ n1++; p1 = p1->next; } while(p2 != NULL){ n2++; p2 = p2->next; } p1 = headA; p2 = headB; if(n1 > n2){ n = n1 - n2; while(n != 0){ p1 = p1->next; n--; } } if(n1 < n2){ n = n2 - n1; while(n != 0){ p2 = p2->next; n--; } } while (p1 != NULL && p2 != NULL) { if (p1 == p2) return p1; p1 = p1->next; p2 = p2->next; } return NULL; } };
discussion区还有更简单的算法My-accepted-simple-and-shortest-C++-code ,但是理解起来不是很好理解(个人感觉。。)