0
点赞
收藏
分享

微信扫一扫

java实现leetcode 160

Java实现LeetCode 160

目录

  1. 引言
  2. 问题描述
  3. 解题思路
  4. 代码实现
  5. 总结

引言

本文旨在教会刚入行的小白如何使用Java实现LeetCode 160题。我们将讨论该问题的描述、解题思路以及具体的代码实现。

问题描述

LeetCode 160题的问题描述如下:

给定两个链表,找到它们第一个公共节点。

示例:

输入:listA = [4,1,8,4,5], listB = [5,0,1,8,4,5]
输出:8
解释:第一个公共节点是 8。

注意:

  • 如果两个链表没有交点,返回 null
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。

解题思路

要解决这个问题,我们可以使用双指针法。首先,我们需要先了解链表的基本概念。

链表是由一系列节点组成的数据结构,每个节点包含一个值和一个指向下一个节点的指针。在本问题中,我们需要找到两个链表的公共节点,即两个链表在某个节点开始重合。

我们可以使用双指针法来解决这个问题。我们定义两个指针 pApB,分别指向两个链表的头节点。我们同时遍历两个链表,当一个指针到达链表的末尾时,将其指向另一个链表的头节点。这样,当两个指针相遇时,它们所指向的节点即为第一个公共节点。

代码实现

下面是使用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 方法中,我们使用两个指针 pApB 来遍历两个链表。

  • 首先,我们判断两个链表的头节点是否为空,如果为空,则直接返回 null

  • 接下来,我们进入一个循环,直到两个指针相遇为止。

  • 在循环中,我们分别判断指针 pApB 是否为空。如果其中一个指针到达链表末尾,则将其指向另一个链表的头节点,这样可以保证两个指针遍历的长度相等。

  • 最后,当两个指针相遇时,返回它们所指向的节点,即为第一个公共节点。

总结

本文介绍了如何使用Java实现LeetCode 160题。我们采用了双指针法来解决这个问题,通过定义两个指针分别遍历两个链表,并在遍历过程中判断两个指针是否相遇,从而找到第一个公共节点。

这个问题的解决思路比较巧妙,通过使用双指针法,可以在时间复杂度为 O(m+n) 的情况下解决问题,其中 m 和 n 分别为两个链表的长度。

举报

相关推荐

0 条评论