您的位置:首页 > 其它

两个有序链表合并

2017-08-17 19:26 429 查看
点:基本功

题意:两个有序单向链表合并为一个新的链表

剑指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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: