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.
解法1:
首先,计算链表A和链表B的长度,其次移动指针至二者剩余长度相同的地方,再两个链表每次移动1个单位判断值是否相同
var getIntersectionNode = function(headA, headB) { if(!headA || !headB) {return;} var lenA = length(headA),lenB = length(headB); while(lenA>lenB) { headA = headA.next; lenA--; } while(lenA<lenB) { headB = headB.next; lenB--; } while (headA != headB) { headA = headA.next; headB = headB.next; } return headA; }; var length = function(head) { var len = 0; while(head != null) { len++; head = head.next; } return len; };
解法2:
两链表不同时向后移动一个单位,当短的链表循环完后指向长链表头,因此第二轮循环时指针会指向长度相同的位置
var getIntersectionNode = function(headA, headB) { if(headA == null || headB == null) return null; var a = headA; var b = headB; while( a != b){ a = a == null? headB : a.next; b = b == null? headA : b.next; } return a; };