1.題目要求
這是一道求職面試時經常要求手寫或者機試的經典題目。
已知兩個鍊錶head1和head2各自有序,請把它們合併成乙個鍊錶依然有序。結果鍊錶要包含head1和head2的所有節點,即使節點值相同。
注意:不能開闢新空間來儲存合併後的鍊錶。如果第一次做該題,很容易會想到使用新煉表來儲存合併後的有序鍊錶。雖然可以如此實現,但是不符合常規解法和面試官的要求。
2.非遞迴實現
演算法過程:
輸入:兩個有序的單鏈表head1與head2;
輸出:合併後的有序單鏈表mergehead;
演算法描述:
(1)如果head1或head2為空鍊錶,則直接返回另外乙個鍊錶;
(2)選擇head1與head2鍊錶當前節點值較小的節點,掛接到後並後的鍊錶mergehead;
(3)重複步驟2,直到鍊錶head1或者head2遍歷完成,未遍歷完的鍊錶,直接掛接到mergehead的尾節點。
具體實現如下:
#include
#include
using namespace std;
struct listnode
listnode(int value,listnode* next = null):value(value),next(next){}
};//@brief:非遞迴實現兩個有序單鏈表
//@注意:兩個鍊錶需要從小到大順序排列
listnode* mergeorderedlinkedlist(listnode* head1,listnode* head2)
else if(head2 == null)
listnode* mergehead = null;
if (head1->valuevalue)
else
listnode* tmpnode = mergehead;
while(head1&&head2)
else
mergehead = mergehead->next;
} if (head1)
if (head2)
return tmpnode;
}//列印鍊錶
void printlinkedlist(listnode* head)
else
} cout<>value) //從string中按照空格讀取int
else
} //合併兩個有序鍊錶
listnode* mergehead=mergeorderedlinkedlist(程式設計客棧head1,head2);
//列印鍊錶
cout<
執行程式,輸出結果:
從小到大順序輸入鍊錶1:
1 2 3 5
ss0 strin:1 2 3 5
從小到大順序輸入鍊錶2:
3 4 5 6 7 8
ss1 strin:3 4 5 6 7 8
合併後鍊錶:
1 2 3 3 4 5 5 6 7 8
3.遞迴實現
從上面合併兩個有序鍊錶的步驟中可以看出,每次合併的步驟(2)都是一樣的,由此我們想到了遞迴。具體實現如下:
//@brief:遞迴實現兩個有序單鏈表
//@注意:兩個鍊錶需要從小到大順序排列
listnode* mergeorderedlinkedlistrecursion(listnode* head1,listnode* head2)
else if(head2 == null)
listnode* mergehead = null;
if(head1->valuevalue)
else
return mergehead;
}
如何合併兩個有序鍊錶
已知兩個鍊錶head1和head2各自有序 例如公升序排列 請把他們合併成乙個鍊錶,要求合併後的鍊錶依然有序。class lnode def init self self.data none self.next none def constructlist start 方法功能 構造鍊錶 param...
如何合併兩個有序鍊錶
albb面試題 題目 把兩個有序的鍊錶合併成乙個有序的鍊錶,例如 1 5 6 和 2 3 7 8,合併之後變成了 1 2 3 5 6 7 8。解 合併兩個有序鍊錶 class node def init self,data self.data data self.next none class li...
合併兩個有序鍊錶 C
合併兩個有序鍊錶 遞迴實現 演算法思想 遞迴終止條件 若head1為空,返回head2指標 head 若head2為空,返回head1指標 head 遞迴過程 1 若head1 data head2 data head 指標應該指向head2所指向的節點,而且head next應該指向head1和h...