Leetcode 相交链表
Day 10 刷题
#######简单粗暴,两层循环,空间复杂度\(\mathcal{O}(1)\)
public class Solution {
// 不可增加输入
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode aNode = headA; //A链表头节点
while(aNode!= null){ // 可能只有一个节点在链表中
ListNode bNode = headB; // B链表头节点
while(bNode!= null){
if(aNode==bNode){
return aNode;
}
// 头节点不断后移
bNode = bNode.next;
}
aNode = aNode.next;
}
return null;
}
}
官方思路:使用hashmap来存储A链表内的值,再去搜寻B链表内是否包含,时间复杂度降低为\(\mathcal{O}(m+n)\),但空间复杂度仍然与输入成正比,非常数级。(以时间换空间)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode aNode = headA; //A链表头节点
List<ListNode> list = new ArrayList<ListNode>(); //Set<ListNode> list = new HashSet<ListNode>();
int i = 0;
while(aNode!= null){
list.add(aNode);
aNode = aNode.next;
}
ListNode bNode = headB; // B链表头节点
while(bNode!= null){
// 地址一致
if(list.contains(bNode)){
return bNode;
}
// 头节点不断后移
bNode = bNode.next;
}
return null;
}
}
hashmap的初始化
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
双指针方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode aNode = headA; //A链表头节点
ListNode bNode = headB; //B链表头节点
while(true){
if(aNode == bNode||(aNode ==null &&bNode==null) ){
return aNode;
}
aNode = aNode==null?headB:aNode.next;
bNode = bNode==null?headA:bNode.next;
}
}
}
时间复杂度为\(\mathcal{O}(m+n)\)!因为两者在遍历两次后必然是相同长度,同时到达相交点!