Java实现LeetCode 160
目录
- 引言
- 问题描述
- 解题思路
- 代码实现
- 总结
引言
本文旨在教会刚入行的小白如何使用Java实现LeetCode 160题。我们将讨论该问题的描述、解题思路以及具体的代码实现。
问题描述
LeetCode 160题的问题描述如下:
给定两个链表,找到它们第一个公共节点。
示例:
输入:listA = [4,1,8,4,5], listB = [5,0,1,8,4,5]
输出:8
解释:第一个公共节点是 8。
注意:
- 如果两个链表没有交点,返回
null
。 - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
解题思路
要解决这个问题,我们可以使用双指针法。首先,我们需要先了解链表的基本概念。
链表是由一系列节点组成的数据结构,每个节点包含一个值和一个指向下一个节点的指针。在本问题中,我们需要找到两个链表的公共节点,即两个链表在某个节点开始重合。
我们可以使用双指针法来解决这个问题。我们定义两个指针 pA
和 pB
,分别指向两个链表的头节点。我们同时遍历两个链表,当一个指针到达链表的末尾时,将其指向另一个链表的头节点。这样,当两个指针相遇时,它们所指向的节点即为第一个公共节点。
代码实现
下面是使用Java实现LeetCode 160题的代码:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode pA = headA;
ListNode pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}
代码解释:
-
在开始编写代码之前,我们首先需要定义链表节点的数据结构。在上述代码中,我们使用
class ListNode
定义了一个单链表节点,包含一个整数值val
和一个指向下一个节点的指针next
。 -
在
getIntersectionNode
方法中,我们使用两个指针pA
和pB
来遍历两个链表。 -
首先,我们判断两个链表的头节点是否为空,如果为空,则直接返回
null
。 -
接下来,我们进入一个循环,直到两个指针相遇为止。
-
在循环中,我们分别判断指针
pA
和pB
是否为空。如果其中一个指针到达链表末尾,则将其指向另一个链表的头节点,这样可以保证两个指针遍历的长度相等。 -
最后,当两个指针相遇时,返回它们所指向的节点,即为第一个公共节点。
总结
本文介绍了如何使用Java实现LeetCode 160题。我们采用了双指针法来解决这个问题,通过定义两个指针分别遍历两个链表,并在遍历过程中判断两个指针是否相遇,从而找到第一个公共节点。
这个问题的解决思路比较巧妙,通过使用双指针法,可以在时间复杂度为 O(m+n) 的情况下解决问题,其中 m 和 n 分别为两个链表的长度。