相交链表
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 63 ms, 内存: 26.0 MB
/*
* 题目思路:
* 使用 Java Stream 不适用于处理链表的这种特定问题,因为链表的遍历需要依赖于节点的指针操作,
* Stream 更适合处理集合类的数据流操作。但我们可以简单模拟传统方法。
*/
import java.util.HashSet;
import java.util.Set;
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> visited = new HashSet<>();
ListNode current = headA;
while (current != null) {
visited.add(current);
current = current.next;
}
current = headB;
while (current != null) {
if (visited.contains(current)) {
return current;
}
current = current.next;
}
return null;
}
}
解释
方法:
此题解采用了双指针的方法。两个指针分别指向两个链表的头节点,然后依次向后遍历。当一个指针到达链表末尾时,将其指向另一个链表的头节点继续遍历。这样,两个指针会在第二次遍历时同时到达相交节点或者都到达末尾(不相交的情况)。这个方法利用了一个事实:两个链表的头节点到相交节点的距离差等于两个链表的长度差。
时间复杂度:
O(m+n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在指针到达链表末尾时,需要将其重新指向另一个链表的头节点,这样做的目的是什么?
▷🦆
如果链表相交,双指针在什么情况下会同时到达相交节点?
▷🦆
在没有相交点的情况下,双指针最终会停在什么位置?
▷