c 如何合併兩個有序鍊錶

2022-09-27 07:39:07 字數 1866 閱讀 5919

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...