找出链表的第一个公共结点 java_算法系列之-两个链表的第一个公共节点

01 题目描述

输入两个单向链表,找两个链表的第一个公共节点(从第一个公共节点之后都是公共节点)。

如链表

0b1223bbdc5133fd2dfd93ff2e119cdf.png

则第一个公共节点是6

02 解法1

暴力解法,从链表1的第一个节点开始循环,在第二个链表中查找是否存在该节点。存在即为公共节点输出。

该解法的时间复杂度O(n^2),空间复杂度是O(1)

03 解法2

我们观察链表发现,从公共节点开始到最后一个节点都是完全相同的。

24f277b99d1dec881a97bcd276b86093.png

思考什么数据结构可以从后面开始对比。

栈刚好符合这种情况。我们将链表1的节点和链表2的节点分别放入两个辅助栈中。分别从最后一个节点弹出节点值,对比是否是同一个节点。直到两个节点的值不相等,则上一个出栈的节点,就是要找的第一个公共节点。

d255ff20c4fa9118ba9a9fa1614807a6.png

时间复杂度O(n+m) 空间复杂度 o(n+m), n 和 m分别是两个链表的长度。

04 解法3

既然在解法2中我们已经遍历了两个单向链表,那么我们何不记下来两个链表的长度 m,n。如下图 m.length=5, n.length = 4。

0b1223bbdc5133fd2dfd93ff2e119cdf.png

然后再次遍历,让指针在m的链表上先行 1 (m-n)步。n上的指针后出发,让两个对齐。之后边遍历,边对比值,相等即为第一个公共节点。

96ce50bf4dc88d4d358c31c5c5bbbd35.png

这样就没有辅助空间了,时间复杂度还是保留在线性范围内o(m+n).

05 代码

第三种解法的代码。

public static ListNode firstCommonNode(ListNode listNodeA, ListNode listNodeB){ if (listNodeA == null || listNodeB == null) { return null; } int listNodeACount = 0; ListNode countANode = listNodeA; while (countANode != null) { listNodeACount ++; countANode = countANode.next; } int listNodeBCount = 0; ListNode countBNode = listNodeB; while (countBNode != null) { listNodeBCount ++; countBNode = countBNode.next; } int diff = Math.abs(listNodeACount - listNodeBCount); if (listNodeACount >= listNodeBCount) { while (diff > 0) { listNodeA = listNodeA.next; diff --; } } else { while (diff > 0) { listNodeB = listNodeB.next; diff --; } } while (listNodeA != listNodeB && listNodeA != null) { listNodeA = listNodeA.next; listNodeB = listNodeB.next; } return listNodeA;}class ListNode { int value ; ListNode next; public ListNode () { } public ListNode(int value) { this.value = value; } public ListNode(int value, ListNode next) { this.value = value; this.next = next; }}

测试用例

1.没有公共节点。

2.公共节点在第一个,公共节点在中间或者最后一个

3.链表一或者链表二为空。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值