• 160. 相交链表


    编写一个程序,找到两个单链表相交的起始节点。

    如下面的两个链表:

    在节点 c1 开始相交。

    示例 1:

    输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
    输出:Reference of the node with value = 8
    输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
    

    示例 2:

    输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
    输出:Reference of the node with value = 2
    输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
    

    示例 3:

    输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
    输出:null
    输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
    解释:这两个链表不相交,因此返回 null。
    

    注意:

    • 如果两个链表没有交点,返回 null.
    • 在返回结果后,两个链表仍须保持原有的结构。
    • 可假定整个链表结构中没有循环。
    • 程序尽量满足 O (n) 时间复杂度,且仅用 O (1) 内存。

    解法一:拿个map来记录其中一个链表的所有节点,再遍历另外一个节点,如果首次碰到和map里的元素相同的就是相交的点,返回即可,如果遍历结束还没找到就是没有相交,返回null即可

    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            HashMap<ListNode,Integer> map = new HashMap<>();
            while(headA!=null){
                if(!map.containsKey(headA)){
                    map.put(headA,1);
                }
                headA = headA.next;
            }
            while(headB!=null){
                if(map.containsKey(headB)){
                    return headB;
                }
                headB = headB.next;
            }
            return null;
        }
    }

    解法二:计算两个链表的长度,然后计算出他们的差值,让长链表先走差值大小,这样他们的长度就相同了。然后就可以一起移这两个链表了。当他们相等的时候就可以返回了。

    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            int p1 = 0,p2 = 0;
            ListNode curA = headA;
            ListNode curB = headB;
            while(curA!=null || curB!=null){
                if(curA!=null){
                    p1++;
                    curA = curA.next;
                }
                if(curB!=null){
                    p2++;
                    curB = curB.next;
                }
            }
            if(p1 > p2){
                int temp = p1 - p2;
                while(temp-- > 0){
                    headA = headA.next;
                }
            }
            if(p1 < p2){
                int temp = p2 - p1;
                while(temp-- > 0){
                    headB = headB.next;
                }
            }
            while(headA!=null){
                if(headA == headB){
                    return headA;
                }
                headA = headA.next;
                headB = headB.next;
            }
            return null;
        }
    }
  • 相关阅读:
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    英文标点
    post sharp 与log4net 结合使用,含执行源码 转拷
  • 原文地址:https://www.cnblogs.com/czsy/p/10963792.html
Copyright © 2020-2023  润新知