【剑指Offer】个人学习笔记_52_两个链表的第一个公共节点

刷题日期:下午8:06 2021年5月14日星期五

个人刷题记录,代码收集,来源皆为leetcode

经过多方讨论和请教,现在打算往Java方向发力

主要答题语言为Java

题目:

剑指 Offer 52. 两个链表的第一个公共节点

难度简单223

输入两个链表,找出它们的第一个公共节点。

如下面的两个链表**:**

img

在节点 c1 开始相交。

示例 1:

img

输入: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:

img

输入: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:

img

输入: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) 内存。
题目分析

程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。仅用几个指针实现,并且只能走一遍,不能套两层循环,那样就O(n2)了。

第一次见这么长的题目,

初始解答:

两层遍历也写不出来

/**
 * 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 a = headA, b = headB; //两个指针
        //链表也不涉及排序,先直接遍历
        while(a != null) {
            while(b != null) {
                if(a.val == b.val) {
                    return a;
                }
                b = b.next;
                break;
            }
            a = a.next;
        }
        return null;
    }
}

输入 8 [4,1,8,4,5] [5,0,1,8,4,5] 2 3

输出 No intersection

差别 预期结果 Intersected at ‘8’

学习方法一,思路是对的,没有别人的设计巧妙,太强了

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode a = headA, b = headB; //两个指针
        //链表也不涉及排序,先直接遍历
        while(a != b) {
            a = a == null ? headB : a.next; //a为空则指向headB,否则下一个
            b = b == null ? headA : b.next; //同理,如果没有则最终都会指向空
        }
        return a;
    }
}

执行结果:通过

显示详情 添加备注

执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:40.8 MB, 在所有 Java 提交中击败了97.37%的用户

学习他人:

方法一:

宝石L2 (编辑过)2020-02-14 Java 题解 简单明了

设交集链表长c,链表1除交集的长度为a,链表2除交集的长度为b,有

  • a + c + b = b + c + a
  • 若无交集,则a + b = b + a
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        
        ListNode h1 = headA, h2 = headB;
        while (h1 != h2) {

            h1 = h1 == null ? headB : h1.next;
            h2 = h2 == null ? headA : h2.next;
        }

        return h1;  
    }

方法二:

这题基本就一种解法hh。

K神:作者:jyd
链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/solution/jian-zhi-offer-52-liang-ge-lian-biao-de-gcruu/
来源:力扣(LeetCode)

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode A = headA, B = headB;
        while (A != B) {
            A = A != null ? A.next : headB;
            B = B != null ? B.next : headA;
        }
        return A;
    }
}

总结

以上就是本题的内容和学习过程了,公共节点意思是指针地址相同,而不是指针指向的值相同,比如:

Jerry银银L4 2020-02-12 :[4,1,8,4,5] [5,0,1,8,4,5] 为什么相交节点是:8,而不是1?

相交节点是说相交节点之后的链表一样,即a.next = b.next,8后面的也要一样,

Young Wind 因为这里公共节点的判断标准是通过地址是否相等来判断的。 如果节点地址相等,那么他们的值一定相等。 但是节点的值相等,他们的地址并不一定相等。 对于上面的题目有可能出现两种情况:

  1. 如果第一个数组的1的地址和第二个数组的1的地址是相等的,那么相交节点就是1, 只不过测试用例中设置的就是不相等的。所以容易造成误解。
  2. 反之,不相等,就是题解或者测试用例中的情况。

欢迎讨论,共同进步。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值