Java中的Merge Two Sorted LinkedList(使用默认的LinkedList类,而不是自定义类)



所以我试图解决合并两个排序列表的Leetcode问题(#21(,但我试图使用Java中的标准LinkedList类(Leetcode的问题使用自定义的"ListNode"类

public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode tail = head;
while(l1 != null && l2 != null) {
if (l1.val <= l2.val) {
tail.next = l1;
l1 = l1.next;
} else {
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}

if (l1 != null) {
tail.next = l1;
} else if (l2 != null) {
tail.next = l2;
}

return head.next;
}

我很理解,但是如果我使用LinkedList类,我会用什么来代替l1.vall2.val?LinkedList似乎没有检索当前节点值的函数,但肯定有办法做到这一点吗?这似乎是一个非常标准的列表。

LinkedList类不允许您访问节点,只允许您访问值。因此,从来没有像l1.vall1.next那样的属性访问。遍历链表实例的一种方法是使用listIterator方法创建迭代器。这个迭代器不产生节点,而是产生值。

尽管可以使用LinkedList类来接近第一个循环,但不能执行上一个if...else块中完成的步骤:您必须将剩余列表的每个值添加到结果列表中——无法将结果列表的尾部与另一个列表链接起来。

以下是使用迭代器的方法。注意,我已经将while条件设置为逻辑OR条件,而不是AND条件,因此为了处理上面段落中提到的问题:

public LinkedList<Integer> mergeTwoLists(LinkedList<Integer> l1, LinkedList<Integer> l2) {
LinkedList<Integer> result = new LinkedList<Integer>();
ListIterator<Integer> iter1 = l1.listIterator();
ListIterator<Integer> iter2 = l2.listIterator();
Integer value1 = iter1.hasNext() ? iter1.next() : null;
Integer value2 = iter2.hasNext() ? iter2.next() : null;
while (value1 != null || value2 != null) {
if (value2 == null || value1 != null && value1 <= value2) {
result.add(value1);
value1 = iter1.hasNext() ? iter1.next() : null;
} else {
result.add(value2);
value2 = iter2.hasNext() ? iter2.next() : null;
}
}
return result;
}

相关内容

  • 没有找到相关文章

最新更新