如何解决使用向下指针对链接列表进行排序
我偶然发现了需要优化方法的算法问题。 来了
假设我有一个已排序的链表。链表的每个元素都可以有一个向下的指针,该指针也包含一个也要排序的列表。
将这样的列表与后续的向下列表合并的最佳记忆和省时方法是什么?
例如,
1 -> 5 -> 10 -> 60 -> 100
| | |
20 50 101
| |
30 70
这应该转换为:
1 -> 5 -> 10 -> 20 -> 30 -> 50 -> 60 -> 70 -> 100 -> 101
链表的数据结构:
Node {
Node next;
List down;
Integer value;
}
预先感谢:)
解决方法
最简单有效的方法是扫描整个“主”列表,取消链接每个“下列表”并将其附加到主列表中,最后自然合并对结果列表进行整体排序。
,想法:
遍历原始链表,并相应地合并元素的链表。
这是用c++
编写的代码,这是一种迭代方法,但是您也可以类似地编写递归方法,该方法当然看起来很简单,但没有一行,但不是O(1)。因此,最好使用迭代方法:
// same logic merging two sorted arrays
Node* merge(Node *head1,Node *head2) {
struct Node *end = NULL;
struct Node *start = NULL;
// merge till one of the linked list is completely traversed
while (head1 != 0 and head2 != 0) {
if (head1->data <= head2->data) {
if (end == NULL) {
start = head1;
end = start;
}
else {
end->bottom = head1;
end = end->bottom;
}
head1 = head1->bottom;
}
else {
if (end == NULL) {
start = head2;
end = head2;
}
else {
end->bottom = head2;
end = end->bottom;
}
head2 = head2->bottom;
}
}
// check for the remaining elements in linked list which was not traversed completely
if (head1 != NULL) {
end->bottom = head1;
}
else {
end->bottom = head2;;
}
return start;
}
Node *flatten(Node *root)
{
// base condition
if (root == NULL || root->next == NULL) {
return root;
}
// merge the linked list of elements accordingly
Node *prev = root,*to = root->next;
while (to != NULL) {
prev = merge(prev,to);
to = to->next;
}
return prev;
}
,
这是解决方案的链接: https://www.geeksforgeeks.org/flattening-a-linked-list/
仅向您简要介绍此链接上的帖子: 从列表的最左节点开始,您需要执行“合并”排序的合并步骤。 此合并将在最左边的节点的右节点(1的右边,即5)向下列表与最左边节点的down列表(1的倒数,为null)之间发生。
您需要创建一个新的展平列表,并在比较两个列表之后将节点添加到此列表中。
合并2个下列表后,继续在主列表中前进。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。