您的位置:首页 > Web前端

剑指offer 合并两个排序的链表

2016-03-13 10:07 393 查看
题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

(hint: 请务必使用链表。)

思路:首先新建一个链表,因为连个链表都是有序的,所以只需要在一个链表的基础上添加另一个的元素即可。

具体做法:维护链表内的一个指针,当要插入第二个链表的元素时,这个指针从头遍历链表,当当前节点大于等于要插入的元素时,将其插入到这个节点的前部,保存指针指向新插入的节点。

#include <cstdio>
using namespace std;

typedef struct Node{
int val;
Node *next;
Node(int val = -1) : val(val), next(NULL) {}
} *pNode;

class List{
private:
pNode Head;
pNode Tail;
pNode curNode;
public:
void Push_Back(int);
void Insert_Node(int);
void Traverse();
void Delete_List();
List();
~List();
};

void List::Push_Back(int x){
this->Tail->next = new Node(x);
this->Tail = this->Tail->next;
}

void List::Insert_Node(int x){
while(this->curNode->next){
if(this->curNode->next->val >= x){
pNode node = new Node(x);
node->next = this->curNode->next;
this->curNode->next = node;
return;
}
else
this->curNode = this->curNode->next;
}
this->curNode->next = new Node(x);
this->curNode = this->curNode->next;
}

void List::Traverse(){
pNode p = this->Head->next;
if(p == NULL){
printf("NULL");
return;
}
while(p){
printf("%d", p->val);
p = p->next;
if(p)
printf(" ");
}
}

List::List(){
Head = Tail = curNode = new Node();
}

void List::Delete_List(){
pNode fa = this->Head;
pNode ch = fa->next;
while(ch){
delete fa;
fa = ch;
ch = ch->next;
}
delete fa;
}

List::~List(){
Delete_List();
}

int main()
{
int n, m;
int x;
while(scanf("%d%d", &n, &m) != EOF){
List *list = new List();
for(int i = 0; i < n; i++){
scanf("%d", &x);
list->Push_Back(x);
}
for(int i = 0; i < m; i++){
scanf("%d", &x);
list->Insert_Node(x);
}
list->Traverse();
printf("\n");
delete list;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: