将两个有序链表合并

将两个有序链表合并

思路:

1)设定两个指针,分别指向链表1的头和链表2的头;

2)创建新得链表头p;

3)如果p1的值<p2的值,则p1的值为新链表的头节点值,即p=p1->value;

                               反之,则p2的值为新链表的头节点值,即p=p2->value;

4)对于剩下的链表用同样的方式进行比较,将较小的值拿去新链表并与上个数值链接起来。

5)可以采用递归实现,后面剩余节点的比较

6)特殊情况:当链表1为空时,新得合并链表为链表2;当链表2为空时,新得合并链表为链表1.

#include<iostream>
using namespace std;

struct Node {
    int value;
    Node* next;
    Node(int v) :value(v) {}
};
//创建一个有序链表
Node* CreateList1()
{
    Node *head;
    Node* n1 = new Node(1);
    Node* n3 = new Node(3);
    Node* n5 = new Node(5);
    Node* n7 = new Node(7);
    Node* n9 = new Node(9);
    head = n1;
    n1->next = n3;
    n3->next = n5;
    n5->next = n7;
    n7->next = n9;
    n9->next = NULL;
    return head;

}
Node* CreateList2()
{
    Node* head;
    Node* n2 = new Node(2);
    Node* n4 = new Node(4);
    Node* n6 = new Node(6);
    Node* n8 = new Node(8);
    //Node* n10 = new Node(10);
    head = n2;
    n2->next = n4;
    n4->next = n6;
    n6->next = n8;
    n8->next = NULL;
    return head;

}
//释放链表空间
void FreeList(Node *head)
{
    if (head == NULL)
    {
        return;
    }
    else {
        Node* temp = head->next;
        delete head;
        head = temp;
        FreeList(head);
    }
}
//递归的方式遍历链表中的元素
void BianList(Node* head)
{
    if (head)
    {
        cout << head->value << "->";
        BianList(head->next);
    }
    else {
        cout << "null" << endl;
    }
}
Node* ListMerge(Node* head1, Node* head2)
{
    if (head1 == nullptr)
    {
        return head2;
    }
    else if(head2 == nullptr)
    {
        return head1;
    }
    Node* Mergehead = nullptr;
    if (head1->value < head2->value)
    {
        Mergehead = head1;
        Mergehead->next = ListMerge(head1->next, head2);
    }
    else
    {
        Mergehead = head2;
        Mergehead->next = ListMerge(head1, head2->next);
    }
    return Mergehead;
}

int main()
{
    Node* head1 = CreateList1();
    Node* head2 = CreateList2();
    cout << "合并前输出:" << endl;
    cout << "链表1:";
    BianList(head1);
    cout << "链表2:";
    BianList(head2);
    cout << "合并后输出:" << endl;
    Node * Mergehead=ListMerge(head1, head2);
    BianList(Mergehead);
    FreeList(Mergehead);
    return 0;
}

参考链接:(19条消息) 算法题:合并两个有序的链表_JXH_123的博客-CSDN博客

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值