// 面试题25:合并两个排序的链表
// 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
// 照递增排序的。
static std::shared_ptr<node_link<int>> merge(std::shared_ptr<node_link<int>> h1,
std::shared_ptr<node_link<int>> h2)
{
if(h1 == nullptr)
{
return h2;
}
if(h2 == nullptr)
{
return h1;
}
std::shared_ptr<node_link<int>> head = nullptr;
if(h1->data < h2->data)
{
head = h1;
h1=h1->next;
}
else
{
head = h2;
h2=h2->next;
}
auto temp = head;
while (h1!=nullptr && h2!=nullptr)
{
if(h1->data < h2->data)
{
temp->next = h1;
h1=h1->next;
}
else
{
temp->next = h2;
h2=h2->next;
}
temp = temp->next;
}
if(h1!=nullptr)
{
temp->next = h1;
}
if(h2!=nullptr)
{
temp->next = h2;
}
return head;
}
static std::shared_ptr<node_link<int>> merge_r(std::shared_ptr<node_link<int>> h1,
std::shared_ptr<node_link<int>> h2)
{
if(h1 == nullptr)
{
return h2;
}
if(h2 == nullptr)
{
return h1;
}
std::shared_ptr<node_link<int>> head = nullptr;
if(h1->data < h2->data)
{
head = h1;
head->next = merge_r(h1->next, h2);
}
else
{
head = h2;
head->next = merge_r(h1, h2->next);
}
return head;
}