合并两个有序链表,合并后依然有序 --- 三种方法

1.合并链表p1,p2到p1上
void CombineList(ListNode** p1,ListNode* p2)//合并链表p1,p2 到p1
{
    if (*p1 == NULL)
    {
        *p1 = p2;
        return;
    }
    if (p2 == NULL)
    {
        return;
    }
    ListNode* cur1 = NULL;
    ListNode* pre1 = NULL;
    ListNode* cur2 = NULL;
    ListNode* pre2 = NULL;
    ListNode* now = NULL;
    cur1 = *p1;
    pre1 = cur1;
    cur2 = p2;
    if (cur2->data <= cur1->data)//从小到大排序
    {
        pre2 = cur2->next;
        cur2->next = cur1;
        cur1 = cur2;
        pre1 = cur1->next;
        cur2 = pre2;
    }
    else
    {
        now = pre1;
        pre1 = cur1->next;
    }
    while (pre1&&cur2)
    {

        if (cur2->data <= pre1->data)//从小到大排序
        {
            pre2 = cur2->next;
            cur2->next = pre1;
            now->next = cur2;
            now = now->next;
            cur2 = pre2;
        }
        else
        {
            now = pre1;
            pre1 = pre1->next;
        }
    }
    if (pre1 == NULL)
    {
        pre1 = pre2;
    }
}
2.合并两个链表,,生成第三个链表 非递归
ListNode* NewCombineList(ListNode* p1, ListNode* p2)//合并两个链表,,生成第三个链表  非递归
{
    ListNode* pNewList = NULL;
    ListNode* p3 = NULL;
    if (p1 == NULL)
        return p2;
    if (p2 == NULL)
        return p1;
    if (p1->data < p2->data)
    {
        pNewList = p3 = p1;
        p1 = p1->next;
    }
    else
    {
        pNewList = p3 = p2;
        p2 = p2->next;
    }
    while (p1&&p2)
    {
        if (p1->data < p2->data)
        {
            p3->next = p1;
            p1 = p1->next;
            p3 = p3->next;
        }
        else
        {
            p3->next = p2;
            p2 = p2->next;
            p3 = p3->next;
        }
    }
    if (p1 == NULL)
        p3 = p2;
    if (p2 == NULL)
        p3 = p1;
    return pNewList;
}
3.合并两个链表,,生成第三个链表 递归
ListNode* ReNewCombineList(ListNode* p1, ListNode* p2)//合并两个链表,,生成第三个链表  递归
{
    ListNode* pNewList = NULL;
    //ListNode* p3 = NULL;
    if (p1 == NULL)
        return p2;
    if (p2 == NULL)
        return p1;
    if (p1->data < p2->data)
    {
        pNewList = p1;
        pNewList->next = ReNewCombineList(p1->next, p2);
    }
    else
    {
        pNewList = p2;
        pNewList->next = ReNewCombineList(p1, p2->next);
    }
    return pNewList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值