这是一个面试问题,但如果有最好的解决方案,我不会。
问题:编写一个函数(用 C# 或 C++)来合并两个已经排序的链表。给定一个数据结构:C++:
class Node
{
public:
int data;
Node* next;
};
C#:
class Node
{
public int data;
public Node next;
};
实现功能: 在 C++ 中:
Node* Merge (Node* head1, Node* head2)
{
…
}
在 C# 中:
Node Merge (Node head1, Node head2)
{
…
}
它接受两个已经排序的链表(按升序),并应该将它们合并为一个排序的链表(按升序)并返回新的头。2 个列表可能具有具有相同数据(int 值)的节点。我们期望结果列表没有相同的数据。
我的解决方案:
Node Merge(Node head1, Node head2)
{
Node merged = head1;
// Both lists are empty
if (head1 == null && head2 == null)
{
return null;
}
// List 1 is empty
else if (head1 == null && head2 != null)
{
return head2;
}
// List 2 is empty
else if (head2 == null && head1 != null)
{
return head1;
}
// Both lists are not empty
else
{
Node cursor1 = head1;
Node cursor2 = head2;
if (cursor1.next.data > cursor2.data)
{
Node temp = cursor1;
cursor1 = cursor2;
cursor2 = temp;
}
// Add all elements from list 2 to list 1
while (cursor1.next != null && cursor2 != null)
{
if (cursor1.next.data < cursor2.data)
{
cursor1 = cursor1.next;
}
else
{
Node temp1 = cursor1.next;
Node temp2 = cursor2.next;
cursor1.next = cursor2;
cursor2.next = temp1;
cursor1 = cursor1.next;
cursor2 = temp2;
}
}
if (cursor1.next == null)
{
cursor1.next = cursor2;
}
}
// Remove duplicates
head1 = merged;
while (head1.next != null)
{
if (head1.data < head1.next.data)
{
head1 = head1.next;
}
else if (head1.data == head1.next.data)
{
head1.next = head1.next.next;
}
}
return merged;
}
请给一些意见,让我知道你的聪明和好的解决方案。谢谢!