(剣指Offer)面接問題17:2つのソートされたチェーンテーブルをマージ
3389 ワード
タイトル:
2つの増分ソートされたチェーンテーブルを入力し、2つのチェーンテーブルを結合し、新しいチェーンテーブルのノードを増分ソートします.
チェーンテーブルノードの定義は次のとおりです.
考え方:
2つのインクリメンタルソートされたチェーンテーブルをマージします.これは、集計ソートされたmergeプロセスに似ています.
1、両方のチェーンテーブルが空でない場合、
チェーンテーブル1のヘッダノードの値がチェーンテーブル2のヘッダノードの値より小さい場合、チェーンテーブル1のヘッダノードは新しいチェーンテーブルのヘッダノードとなり、そうでなければチェーンテーブル2のヘッダノードは新しいチェーンテーブルのヘッダノードとなり、チェーンテーブルポインタは一歩前進する.
2つのチェーンテーブルの残りのノードの動作を同期する.(これは再帰的なプロセスです)
2、2つのチェーンテーブルの少なくとも1つが空である場合、
新しいチェーンテーブルのポインタは空ではないものを指します.
コード:
オンラインテストOJ:
http://www.nowcoder.com/books/coding-interviews/d8b6b4358f774294a89de2a6ac4d9337?rp=1
ACコード:
2つの増分ソートされたチェーンテーブルを入力し、2つのチェーンテーブルを結合し、新しいチェーンテーブルのノードを増分ソートします.
チェーンテーブルノードの定義は次のとおりです.
struct ListNode{
int val;
ListNode* next;
};
考え方:
2つのインクリメンタルソートされたチェーンテーブルをマージします.これは、集計ソートされたmergeプロセスに似ています.
1、両方のチェーンテーブルが空でない場合、
チェーンテーブル1のヘッダノードの値がチェーンテーブル2のヘッダノードの値より小さい場合、チェーンテーブル1のヘッダノードは新しいチェーンテーブルのヘッダノードとなり、そうでなければチェーンテーブル2のヘッダノードは新しいチェーンテーブルのヘッダノードとなり、チェーンテーブルポインタは一歩前進する.
2つのチェーンテーブルの残りのノードの動作を同期する.(これは再帰的なプロセスです)
2、2つのチェーンテーブルの少なくとも1つが空である場合、
新しいチェーンテーブルのポインタは空ではないものを指します.
コード:
struct ListNode{
int val;
ListNode* next;
};
// recursive method
ListNode* Merge_1(ListNode* pHead1, ListNode* pHead2){
if(pHead1==NULL)
return pHead2;
if(pHead2==NULL)
return pHead1;
if(pHead1->val<pHead2->val){
pHead1->next=Merge_1(pHead1->next,pHead2);
return pHead1;
}
else{
pHead2->next=Merge_1(pHead1,pHead2->next);
return pHead2;
}
}
// non-recursive method
ListNode* Merge_2(ListNode* pHead1, ListNode* pHead2){
ListNode *p=new ListNode();
ListNode *MergeHead=p;
while(pHead1!=NULL && pHead2!=NULL){
if(pHead1->val<pHead2->val){
MergeHead->next=pHead1;
pHead1=pHead1->next;
}
else{
MergeHead->next=pHead2;
pHead2=pHead2->next;
}
MergeHead=MergeHead->next;
}
if(pHead1==NULL)
MergeHead->next=pHead2;
if(pHead2==NULL)
MergeHead->next=pHead1;
return p->next;
}
オンラインテストOJ:
http://www.nowcoder.com/books/coding-interviews/d8b6b4358f774294a89de2a6ac4d9337?rp=1
ACコード:
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL)
return pHead2;
if(pHead2==NULL)
return pHead1;
if(pHead1->val<pHead2->val){
pHead1->next=Merge(pHead1->next,pHead2);
return pHead1;
}
else{
pHead2->next=Merge(pHead1,pHead2->next);
return pHead2;
}
}
};
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode *p=new ListNode(0);
ListNode *MergeHead=p;
while(pHead1!=NULL && pHead2!=NULL){
if(pHead1->val<pHead2->val){
MergeHead->next=pHead1;
pHead1=pHead1->next;
}
else{
MergeHead->next=pHead2;
pHead2=pHead2->next;
}
MergeHead=MergeHead->next;
}
if(pHead1==NULL)
MergeHead->next=pHead2;
if(pHead2==NULL)
MergeHead->next=pHead1;
return p->next;
}
};