点:基本功
题意:两个有序单向链表合并为一个新的链表
剑指offer面试题17
思路:基本功,条件要考虑周全。
代码:
#include <iostream>
template<class T> struct Node {
int val;
Node<T> *next;
Node(T _val):val(_val), next(nullptr) {}
};
template<class T> class Slist {
Node<T> *root;
public:
Slist():root(nullptr) {}
~Slist() {
Node<T> *cur = root;
while (cur) {
Node<T> *next = cur->next;
delete cur;
cur = next;
}
}
Node<T> *GetRoot () {
return root;
}
void Add (int val) {
if (!root) {
root = new Node<T>(val);
} else {
Node<T> *cur = root;
while (cur) {
if (cur->next) {
cur = cur->next;
} else {
break;
}
}
Node<T> *newnode = new Node<T>(val);
cur->next = newnode;
}
}
void show () {
if (root) {
Node<T> *cur = root;
while (cur) {
std::cout << cur->val << "\t";
cur = cur->next;
}
std::cout << std::endl;
}
}
};
int main () {
Slist<int> sl1, sl2;
for (int i = 0; i < 10; i++) {
sl1.Add(i);
sl2.Add(i + 2);
//sl2.Add(i + 20);
}
sl1.show();
sl2.show();
Slist<int> sl3;
Node<int> *cur1 = sl1.GetRoot(), *cur2 = sl2.GetRoot();
while (cur1 || cur2) {
if (cur1 && !cur2) {
while (cur1) {
sl3.Add(cur1->val);
cur1 = cur1->next;
}
break;
} else if (cur2 && !cur1) {
while (cur2) {
sl3.Add(cur2->val);
cur2 = cur2->next;
}
break;
}
if (cur1->val <= cur2->val) {
sl3.Add(cur1->val);
cur1 = cur1->next;
} else {
sl3.Add(cur2->val);
cur2 = cur2->next;
}
}
sl3.show();
return 0;
}