下面这些都是垃圾代码,我的大脑一开始拒绝直接操作节点,因为这些操作都会影响原来链表的数据,我要再想想
#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;
}
}