java-理解链接列表与节点的面试问题

问题描述 投票:0回答:3

我目前正在阅读破解编码面试并查看leetcode的问题,并在两个地方都遇到了同样的困惑。特别是LinkedList问题,通常涉及使用节点和创建链接列表的自定义类实现。现在我理解了LinkedList是什么以及每个元素如何被称为“节点”等等。但是当实际使用LinkedList java数据结构时,这个级别似乎太低了,并且让我感到困惑。

这实际上是否与java Collections List / LinkedList api有关?它似乎并非如此。例如,如果我在LinkedList api中搜索“node”,我甚至没有获得一次点击。

请参考以下leetcode问题:

您将获得两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。添加两个数字并将其作为链接列表返回。

您可以假设这两个数字不包含任何前导零,除了数字0本身。

输入:(2 - > 4 - > 3)+(5 - > 6 - > 4)

输出:7 - > 0 - > 8

说明:342 + 465 = 807。

看完这个问题后,我去了我的白板并编写了一个解决方案。正如您可能想象的那样,当我将我的答案与解决方案进行比较时,我立刻感到震惊,因为我的代码与第一行的解决方案不同!

我写了以下内容:

public LinkedList<Integer> addLinkedLists(LinkedList<Integer> l1, LinkedList<Integer> l2)

解决方案有以下几点:

public ListNode addTwoNumbers(ListNode l1, ListNode l2)

请解释一下我似乎缺少的东西。为什么解决方案没有收到实际的LinkedList数据结构?问题清楚地表明返回一个LinkedList,但它返回一个自定义实现的ListNode。我似乎错过了对所问内容的基本理解。

关于leetcode的问题:https://leetcode.com/problems/add-two-numbers/description/

java algorithm generics linked-list singly-linked-list
3个回答
3
投票

除了概念之外,这与Java内置的LinkedList无关。

他们在编程101(或其他所谓的)中教授的一件事是链接列表在一般工作中的表现。

它们通常以单链表开始,如illustrated on Wikipedia,然后将涵盖其他类型的链表,例如双链表(这是内置的LinkedList的实现方式)。有关链接列表类型的完整列表,请参阅Wikipedia文章(第3节)。

在单链表中,列表由节点组成,每个节点都有一个value和一个next节点的引用。在完整列表实现中,节点是List类的内部(类似于LinkedList),但是对于简单/早期实现,只存在ListNode类,并且列表由对“head”/ first的引用表示列表的节点。

这是一个过于简单的问题列表。如果你想为这个低级别的编程“破解编码面试”,你应该研究链表如何在内部工作。

您可以阅读维基百科的文章,或在网上搜索有关Java链表的资料。


1
投票

虽然@Andreas的答案很好,而且更高级别,但我的误解似乎是我不熟悉leetcode的工作方式以及我查看问题的设备使得“提交解决方案”部分不容易引起注意。我的错误是认为这是一个独立的问题。我没有在页面底部注意到以下内容,这意味着如何回答这个问题:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

    }
}

0
投票

在采访中,面试官实际上不会告诉你功能签名是什么样的。您必须根据面试问题决定功能签名(当然,受访者在编写代码之前应与面试官讨论)。

对于这个问题,LinkedList是一个黑盒子,只有几个API可供使用。因此循环列表实际上将采用O(n ^ 2)。因为对于每个元素,您必须从头部或尾部开始并逐步移动到所需位置。但是,使用ListNode有更多的自由度,因此您可以在O(n)处循环列表,这也是此问题的优化时间复杂度。

© www.soinside.com 2019 - 2024. All rights reserved.