我目前正在阅读破解编码面试并查看 leetcode 上的问题,并且在这两个地方遇到了同样的困惑。特别是LinkedList问题,通常涉及使用节点和创建链接列表的自定义类实现。现在我明白了LinkedList是什么以及每个元素如何被称为“节点”等等。但是当实际使用LinkedList java数据结构时,这个级别似乎太低了,并且让我感到困惑。
这是否真的与java Collections List / LinkedList api有关?它似乎并非如此。例如,如果我在LinkedList api中搜索“node”,我甚至没有获得一次点击。
采取以下leetcode问题:
您将获得两个非空链表,表示两个非负数 整数。数字以相反的顺序存储,每个数字都存储 节点包含一个数字。添加两个数字并将其作为a返回 链表。
您可以假设这两个数字不包含任何前导零,除了 数字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/
答案 0 :(得分:3)
这与Java内置LinkedList
无关,除了概念。
他们在编程101(或其他所谓的)中教授的一件事是链接列表在一般工作中的方式。
它们通常以单个链接列表开头,如illustrated on Wikipedia,然后将涵盖其他类型的链接列表,例如双向链表(这是内置Public HttpResponseMessage CallTestMethod()
{
// SetupPath(); setting Rpackage and ODBC package paths in environment no issue with this method.
REngine engine;
engine = REngine.GetInstance();
//Mentioned R Script file path
var val = engine.Evaluate("source('C:/Folder/RProject1/Script.R')");
//Call FetchDatawithoutParam () and get data frame values in dsResult .
var dsResult = engine.Evaluate(@"TempDataResult <- FetchDatawithoutParam ()").AsDataFrame();
}
的实现方式)。有关链表类型的完整列表,请参阅维基百科文章(第3节)。
在单链表中,列表由节点组成,每个节点都有一个FetchDatawithoutParam <- function() {
dbConnection <- odbcDriverConnect('driver={SQL Server};server=.;database=DBName;trusted_connection=true')
DataResult <- sqlQuery(dbConnection, "SELECT * FROM TableName;")
return(DataResult );
odbcClose(dbConnection)
}
和一个对LinkedList
节点的引用。在完整列表实现中,节点是value
类的内部(类似于next
),但是对于简单/早期实现,只存在List
类,并且列表由对列表的“head”/第一个节点的引用表示。
问题正在使用的是这种过于简单的列表类型。如果你想为这个低级别的编程“破解编码面试”,你应该研究链表如何在内部工作。
您可以阅读维基百科的文章,或在网上搜索有关Java链接列表的资料。
答案 1 :(得分:1)
虽然@Andreas的答案很好,而且更高级别,但我的误解似乎是我不熟悉leetcode的工作原理以及我查看问题的设备是否提交了解决方案&#34;提交解决方案&#34;部分不容易引人注意。我的错误是认为这是一个独立的问题。我没有在页面底部注意到以下内容,这意味着如何回答这个问题:
/**
* 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) {
}
}
答案 2 :(得分:0)
在采访中,面试官实际上不会告诉你功能签名是什么样的。您必须根据面试问题决定功能签名(当然,受访者在编写代码之前应与面试官讨论)。
对于此问题,LinkedList
是一个黑盒子,只有几个API可供使用。因此循环列表实际上将采用O(n ^ 2)。因为对于每个元素,您必须从头部或尾部开始并逐步移动到所需位置。但是,使用ListNode
可以获得更多自由,因此您可以将列表循环到O(n),这也是此问题的优化时间复杂度。