Question: 写一个方法(用C#或 C++) 合并两个有序的linked list。给定的数据结构如下:
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)
{
…
}
输入是两个有序 linked lists (升序) 合并它们成为一个有序 linked list (升序)并返回新的head. 这两个 lists可能含带相同数据的结点(是整型). 结果不要有重复的数据。
没分了,学习了
其实挺简单的啊,两个都是升序嘛,用两个指针保持它们的head,然后从两个里面选择最小的节点,挂到结果链表尾部,最后返回去这个结果就玩了。
/// <summary> /// 将两个有序单链表合并成一个新的有序单链表(带头结点,采用尾插法) /// </summary> /// <param name="Ha">有序表a</param> /// <param name="Hb">有序表b</param> /// <returns></returns> private LinkList<int> Merge(LinkList<int> Ha, LinkList<int> Hb) { LinkList<int> Hc = new LinkList<int>(); Node<int> p = Ha.Head.Next; Node<int> q = Hb.Head.Next; Node<int> s = new Node<int>(); Hc = Ha; Hc.Head.Next = null; while (p != null && q != null) { if (p.Data < q.Data) { s = p; p = p.Next; } else { s = q; q = q.Next; } Hc.Append(s.Data); } if (p == null) { p = q; } while (p != null) { s = p; p = p.Next; Hc.Append(s.Data); } return Hc; }
用递归的方法操作:
Node* Merge(Node* head1, Node* head2)
{
if(head1 == null)
return head2;
if(head2 == null)
return head1;
Node* head = null;
if(head1->data < head2->data)
{
head = head1;
head->next = Merge(head1->next, head2);
}
else{
head = head2;
head->next = Merge(head1, head2->Next);
}
return head;
}
高手很多,学习了