#include<iostream>
using namespace std;
class LinkedList {
public:
typedef struct My_Node {
int val;
struct My_Node *next = nullptr;
}Node, *Node_Pointer;
LinkedList() {
MyHead.val = 0;
_size = 0;
}
void InsertList(int num) {
Node_Pointer cur = &MyHead;
while(cur->next) {
if(cur->next->val > num) {
break;
}
cur = cur->next;
}
Node_Pointer NewNode = new Node;
NewNode->val = num;
NewNode->next = cur->next;
cur->next = NewNode;
_size++;
}
void Reversal() {
Node_Pointer pre = nullptr;
Node_Pointer cur = MyHead.next;
Node_Pointer temp;
while(cur) {
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
MyHead.next = pre;
}
Node GetNode() {
return MyHead;
}
void Print_List() {
Node_Pointer cur = MyHead.next;
while(cur) {
cout << cur->val <<" ";
cur = cur->next;
}
cout << endl << endl;
}
void CombineList(Node _list) {
Node_Pointer p1 = this->MyHead.next;
Node_Pointer p2 = _list.next;
Node_Pointer cur = nullptr;
while(p1 != nullptr || p2 != nullptr) {
if(p1->val < p2->val || p2) {
this->MyHead.next = p1;
p1->next = cur;
cur = p1;
p1 = p1->next;
} else {
this->MyHead.next = p2;
p2->next = cur;
cur = p2;
p2 = p2->next;
}
}
cur->next = nullptr;
}
private:
int _size;
Node MyHead;
};
void _input(LinkedList &My_List) {
int Count;
cout << "输入插入节点的个数:" << endl;
cin >> Count;
for(int i = 0; i < Count; i++) {
cout <<"输入插入节点的数值:" << endl;
int num;
cin >> num;
My_List.InsertList(num);
My_List.Print_List();
}
}
int main() {
LinkedList List1 ,List2;
_input(List1);
cout << endl << endl;
_input(List2);
cout << "反转后的链表:" << endl;
List1.Reversal();
List2.Reversal();
List1.Print_List();
List2.Print_List();
cout << "合并后的链表:" << endl;
List1.CombineList(List2.GetNode());
List1.Print_List();
return 0;
}****
【相关推荐】
递归中可能存在这么多的重复计算,为了消除这种重复计算,一种简单的方式就是记忆化递归。即一边递归一边使用“记录表”(比如哈希表或者数组)记录我们已经计算过的情况,当下次再次碰到的时候,如果之前已经计算了,那么直接返回即可,这样就避免了重复计算。而动态规划中 DP 数组其实和这里“记录表”的作用是一样的。