题目描述
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
begin to intersect at node c1.
方法
Approach 1: Brute Force
For each node ai in list A, traverse the entire list B and check if any node in list B coincides with ai.
Complexity Analysis
Time complexity : O(mn)
Space complexity : O(1)
Approach 2: Hash Table
Traverse list A and store the address / reference to each node in a hash set. Then check every node bi in list B: if bi appears in the hash set, then bi is the intersection node.
Complexity Analysis
Time complexity : O(m+n)
Space complexity : O(m)or O(n)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> set = new HashSet<>();
ListNode A = headA;
ListNode B = headB; //Time complexity : O(m+n). Space complexity : O(m) or O(n)
while(A != null){
if(!set.contains(A))
set.add(A);
A = A.next;
}
while( B != null){
if(set.contains(B))
return B;
B = B.next;
}
return null;
}
}
Approach 3: Two Pointers
思路分析:
查找两个链表的共同节点
要求:时间复杂度为 O(N),空间复杂度为 O(1)
设 A 的长度为 a + c, B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b
= b + c + a。
当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样
地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制A和B两个链表的指针能同时访问到交点。
作者:花不休
来源:优快云
原文:https://blog.youkuaiyun.com/huabuxiu/article/details/81869013
版权声明:本文为博主原创文章,转载请附上博文链接!
public class Solution{
//Runtime: 1 ms, faster than 100.00% of Java
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//Approach 2: Two Pointers
//boundary check
if(headA == null || headB == null) return null;
ListNode a = headA;
ListNode b = headB;
//if a & b have different len, then we will stop the loop after second iteration
while( a != b){
//for the end of first iteration,
//we just reset the pointer to the head of another linkedlist
a = a == null? headB : a.next;
b = b == null? headA : b.next;
}
return a;
}
}