一个被干蒙蔽的问题反思

下面这些都是垃圾代码,我的大脑一开始拒绝直接操作节点,因为这些操作都会影响原来链表的数据,我要再想想

#include <iostream>
using namespace std;
class ListNode
{
public:
    int val;
    ListNode *nextNodePointer;
    ListNode() : val(0), nextNodePointer(nullptr) {}
    ListNode(int x) : val(x), nextNodePointer(nullptr) {}
    ListNode(int x, ListNode *nextNodePointer) : val(x), nextNodePointer(nextNodePointer) {}
};


void show(ListNode* List)
{
    ListNode* accessNode = List; //访问List用的指针

    while(accessNode != nullptr)
    {
        cout<< accessNode->val << " -> ";
        accessNode = accessNode->nextNodePointer;
    }
    cout<< "nullptr" << endl;
}


ListNode *merge_and_sort_two_list(ListNode* l1 = nullptr, ListNode *l2 = nullptr)
{
    /***********这是垃圾代码:方案一***********/    
    
    //方案一:把l2级联到l1上,整体换值排序l1,返回l1
    if(l1 == nullptr)
    {
        l1 = l2;
    }
    else
    {
        ListNode* lastNodePointer = l1;
        while(lastNodePointer->nextNodePointer != nullptr)
            lastNodePointer = lastNodePointer->nextNodePointer;
        lastNodePointer->nextNodePointer = l2;
    }
    //此处需要写一个排序l1的程序
    //返回l1

    
    /***********这也是垃圾代码:方案二***********/
    /*
    //方案二:先对l1进行自小到大排序,然后从l2中挑选一个节点,先和l1比较一轮节点值大小,再把节点插入到l1中
    //此处需要写一个排序l1的程序
    ListNode* currentNodePoniter = nullptr;
    ListNode* preNodePoniter = nullptr;
    ListNode* sampleNodePointer = nullptr;

    if(l1 == nullptr) l1 = l2;  //防止l1是空表

    while(l2 != nullptr)  //判断l2是不是所有元素都取完了
    {
        currentNodePoniter = l1;
        sampleNodePointer = l2; //永远采样l2首节点
        l2 = l2->nextNodePointer;

        while(currentNodePoniter != nullptr)
        {

            if(sampleNodePointer->val < currentNodePoniter->val)   //1.如果出现当前节点值比采样值大,把采样值插入到当前值之前
            {
                if(currentNodePoniter == l1)    //1.1如果当前节点是首节点,重现标定首节点
                {
                    sampleNodePointer->nextNodePointer = currentNodePoniter;
                    l1 = sampleNodePointer;

                    break;  //插入完成,退出本次循环 或者 让currentNodePoniter = nullptr
                }
                else     //1.2找到合适插入的位置,插入sample结点
                {
                    preNodePoniter = l1;
                    while (preNodePoniter->nextNodePointer != currentNodePoniter) {
                        preNodePoniter = preNodePoniter->nextNodePointer;
                    }

                    preNodePoniter->nextNodePointer = sampleNodePointer;
                    sampleNodePointer->nextNodePointer = currentNodePoniter;

                    break;  //插入完成,退出本次循环 或者 让currentNodePoniter = nullptr
                }

            }
            else if(currentNodePoniter->nextNodePointer == nullptr) //2.如果找到最后一节点,仍然没有比采样节点大的元素,把采样节点放到末尾
            {
                currentNodePoniter->nextNodePointer = sampleNodePointer;
                sampleNodePointer->nextNodePointer = nullptr;

                break;  //插入完成,退出本次循环 或者 让currentNodePoniter = nullptr
            }
            else
            {
                currentNodePoniter = currentNodePoniter->nextNodePointer;   //取下一个L1节点,继续比较
            }
        }
    }

    return l1;
    */
}

int main(int argc, char* argv[])
{    
    int a[4] = {4,7,2,1};
    int b[4] = {7,5,6,8};
    ListNode *List1 = nullptr;
    ListNode *List2 = nullptr;
    int i = 0;
    while(i < 4)
    {
        List1 = new ListNode(a[i], List1);
        List2 = new ListNode(b[i], List2);
        i = i+1;
    }
    show(List1);
    show(List2);

    ListNode* List = merge_and_sort_two_list(List1,List2);
    show(List);

    return 0;
}

这样的代码有啥用?

ListNode *merge_two_sorted_list(ListNode* l1 = nullptr, ListNode *l2 = nullptr)
{

    if(l1 == nullptr) return l2;
    if(l2 == nullptr) return l1;
    if(l1->val < l2->val)
    {
        l1->nextNodePointer = merge_two_sorted_list(l1->nextNodePointer,l2);
        return l1;
    }
    else
    {
        l2->nextNodePointer = merge_two_sorted_list(l1,l2->nextNodePointer);
        return l2;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值