目录
刷题日期:下午8:06 2021年5月14日星期五
个人刷题记录,代码收集,来源皆为leetcode
经过多方讨论和请教,现在打算往Java方向发力
主要答题语言为Java
题目:
剑指 Offer 52. 两个链表的第一个公共节点
难度简单223
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表**:**
在节点 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) 内存。
题目分析
程序尽量满足 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, 只不过测试用例中设置的就是不相等的。所以容易造成误解。
- 反之,不相等,就是题解或者测试用例中的情况。
欢迎讨论,共同进步。