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.
解题思路:
一定要正确理解题意。Intersection 就是两个链表最后有完全相同的地方。所以要从相同长度开始计算。开始我没有正确理解题意,怎么也想不出来。后来看了答案才明白,简单明了。
1. 得到2个链条的长度。
2. 将长的链条向前移动差值(len1 - len2)
3. 两个指针一起前进,遇到相同的即是交点,如果没找到,返回null.
相当直观的解法。空间复杂度O(1), 时间复杂度O(m+n)
First calculate the length of two lists and find the difference. Then start from the longer list at the diff offset, iterate though 2 lists and find the node.
Java code:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { //First calculate the length of two lists and find the difference. //Then start from the longer list at the diff offset, iterate though 2 lists and find the node. int len1 = 0; int len2 = 0; ListNode p1 = headA; ListNode p2 = headB; if(p1 == null || p2 == null) { return null; } while(p1!= null) { len1++; p1 = p1.next; } while(p2!= null) { len2++; p2 = p2.next; } int diff = 0; p1 = headA; p2 = headB; if(len1 > len2) { diff = len1 -len2; int i = 0; while(i< diff) { p1 = p1.next; i++; } }else { diff = len2- len1; int i = 0; while(i< diff) { p2 = p2.next; i++; } } while(p1 != null && p2 != null) { if(p1.val == p2.val) { return p1; } p1 = p1.next; p2 = p2.next; } return null; }
Reference:
1. http://www.programcreek.com/2014/02/leetcode-intersection-of-two-linked-lists-java/
2. http://yucoding.blogspot.com/2014/12/leetcode-question-intersection-of-two.html