java-理解链接列表与节点的面试问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-理解链接列表与节点的面试问题相关的知识,希望对你有一定的参考价值。
我目前正在阅读破解编码面试并查看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内置的LinkedList
无关。
他们在编程101(或其他所谓的)中教授的一件事是链接列表在一般工作中的表现。
它们通常以单链表开始,如illustrated on Wikipedia,然后将涵盖其他类型的链表,例如双链表(这是内置的LinkedList
的实现方式)。有关链接列表类型的完整列表,请参阅Wikipedia文章(第3节)。
在单链表中,列表由节点组成,每个节点都有一个value
和一个next
节点的引用。在完整列表实现中,节点是List
类的内部(类似于LinkedList
),但是对于简单/早期实现,只存在ListNode
类,并且列表由对“head”/ first的引用表示列表的节点。
这是一个过于简单的问题列表。如果你想为这个低级别的编程“破解编码面试”,你应该研究链表如何在内部工作。
您可以阅读维基百科的文章,或在网上搜索有关Java链表的资料。
虽然@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) {
}
}
在采访中,面试官实际上不会告诉你功能签名是什么样的。您必须根据面试问题决定功能签名(当然,受访者在编写代码之前应与面试官讨论)。
对于这个问题,LinkedList
是一个黑盒子,只有几个API可供使用。因此循环列表实际上将采用O(n ^ 2)。因为对于每个元素,您必须从头部或尾部开始并逐步移动到所需位置。但是,使用ListNode
有更多的自由度,因此您可以在O(n)处循环列表,这也是此问题的优化时间复杂度。
以上是关于java-理解链接列表与节点的面试问题的主要内容,如果未能解决你的问题,请参考以下文章
Java进阶面试题列表 面向对象编程的基本理念与核心设计思想
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试