class
GFG
{
static
class
Node
{
int
data;
Node next;
Node prev;
};
static
Node append(Node head_ref,
int
new_data)
{
Node new_node =
new
Node();
Node last = head_ref;
new_node.data = new_data;
new_node.next =
null
;
if
(head_ref ==
null
)
{
new_node.prev =
null
;
head_ref = new_node;
return
head_ref;
}
while
(last.next !=
null
)
last = last.next;
last.next = new_node;
new_node.prev = last;
return
head_ref;
}
static
void
printList(Node node)
{
Node last;
while
(node !=
null
)
{
System.out.print( node.data +
" "
);
last = node;
node = node.next;
}
}
static
Node mergeList(Node p, Node q)
{
Node s =
null
;
if
(p ==
null
|| q ==
null
)
{
return
(p ==
null
? q : p);
}
if
(p.data < q.data)
{
p.prev = s;
s = p;
p = p.next;
}
else
{
q.prev = s;
s = q;
q = q.next;
}
Node head = s;
while
(p !=
null
&& q !=
null
)
{
if
(p.data < q.data)
{
s.next = p;
p.prev = s;
s = s.next;
p = p.next;
}
else
{
s.next = q;
q.prev = s;
s = s.next;
q = q.next;
}
}
if
(p ==
null
)
{
s.next = q;
q.prev = s;
}
if
(q ==
null
)
{
s.next = p;
p.prev = s;
}
return
head;
}
static
Node mergeAllList(Node head[],
int
k)
{
Node finalList =
null
;
for
(
int
i =
0
; i < k; i++)
{
finalList = mergeList(finalList, head[i]);
}
return
finalList;
}
public
static
void
main(String args[])
{
int
k =
3
;
Node head[] =
new
Node[k];
for
(
int
i =
0
; i < k; i++)
{
head[i] =
null
;
}
head[
0
] = append(head[
0
],
1
);
head[
0
] = append(head[
0
],
5
);
head[
0
] = append(head[
0
],
9
);
head[
1
] = append(head[
1
],
2
);
head[
1
] = append(head[
1
],
3
);
head[
1
] = append(head[
1
],
7
);
head[
1
] = append(head[
1
],
12
);
head[
2
] = append(head[
2
],
8
);
head[
2
] = append(head[
2
],
11
);
head[
2
] = append(head[
2
],
13
);
head[
2
] = append(head[
2
],
18
);
Node finalList = mergeAllList(head, k);
printList(finalList);
}
}