Passion and Patience

Work Hard, Play Hard

导航

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)\)!因为两者在遍历两次后必然是相同长度,同时到达相交点!

posted on 2024-03-25 21:48  安静的聆  阅读(4)  评论(0编辑  收藏  举报