问题:
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.
- If the two linked lists have no intersection at all, return
答案:
- 将A,B两个链表看做两部分,交叉前与交叉后
- 交叉后的长度是一样的,因此交叉前的长度差即为总的长度差
- 只要去除这些长度差,距离交叉点就等距了
- 为了节省计算,在计算链表长度的时候,顺便比较一下两个链表的尾节点是否一样,若不一样,则不可能相交,直接可以返回NULL
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 12 if(headA==NULL||headB==NULL) 13 return NULL; 14 int l1=1; 15 int l2=1; 16 int i; 17 ListNode *p1=headA, *p2=headB; 18 while(p1->next!=NULL){ 19 p1=p1->next; 20 l1++; 21 } 22 while(p2->next!=NULL){ 23 p2=p2->next; 24 l2++; 25 } 26 if(p1->val!=p2->val) 27 return NULL; 28 if(l1>l2){ 29 for(i=0;i<l1-l2;i++){ 30 headA=headA->next; 31 } 32 } 33 if(l1<l2){ 34 for(i=0;i<l2-l1;i++){ 35 headB=headB->next; 36 } 37 } 38 while(headA!=headB){ 39 headA=headA->next; 40 headB=headB->next; 41 } 42 return headA; 43 } 44 };