如何將兩個有序鍊錶合併成乙個有序鍊錶。

2021-07-04 12:06:35 字數 1196 閱讀 9388

有兩個帶頭節點的有序鍊錶,如何把他們合成乙個有序鍊錶?(假設鍊錶帶頭節點)

我們通過取出其中一條鍊錶的頭節點作為合成後的有序鍊錶的頭節點(當然,這裡也可以自己重新生成乙個節點來作為頭節點,但是使用原先的可以節省開銷)。

取出後,這既是新鍊錶的head,也是它的tail,因為新鏈表現在只有這麼乙個節點,我們用tail標記一下它。

接下去,我們去比較兩條鍊錶的數值,取較小值的節點追加到新的鍊錶的尾部。

struct node

;void merge(node* list1, node* list2)

else

r->next = tail->next;

tail->next = r;

tail = r;

}if (p) tail->next = p;

if (q) tail->next = q;

list2->next = null;

}

對上面的**作下稍微的解釋:

p = list1->next;

q = list2->next;

tail = list1;

tail->next = null;

使p,q分別指向兩條鍊錶的第乙個資料節點。

把list1的頭節點取出來作為新鍊錶的頭節點,同時標記為tail,由於此時只有乙個頭節點,所以next為null。

while(p != null && q != null)  else 

r->next = tail->next;

tail->next = r;

tail = r;

}

比較兩條鍊錶各個節點的資料大小,取得較小的節點r,並把r追加到鍊錶的尾部,同時tail指標指向尾部的r,迴圈直到其中一條鍊錶結束。

if (p) tail->next = p;

if (q) tail->next = q;

list2->next = null;

退出迴圈後,把還沒有檢測到尾部的鍊錶追加到新鍊錶的尾部。

list2->next賦值null,防止指標懸空。

(這裡可能會有人說,新生成的鍊錶的節點不是還在嗎?這裡不可能懸空哈!考慮下,萬一通過list1把對應的節點釋放掉了呢,安全問題很重要)

如何將兩個有序鍊錶合併成乙個鍊錶

具體思想就是新建乙個鍊錶,然後比較兩個鍊錶中的元素值,把較小的那個鏈到新鍊錶中,由於兩個輸入鍊錶的長度可能不同,所以最終會有乙個鍊錶先完成插入所有元素,則直接將另乙個未完成的鍊錶直接鏈入新鍊錶的末尾。1 遞迴演算法 也容易理解,但是它的弊端也很明顯時間空間開銷都很大,效率低 2 非遞迴演算法 1 兩...

將兩個有序鍊錶合併成乙個有序鍊錶

c codes as below class link public static link mergesortedlink link firstlink,link secondlink while currentnode2.next null else if currentnode1 null r...

將兩個有序鍊錶合併成乙個有序鍊錶

題目 給定兩個有序的鍊錶,編寫乙個函式來合併這兩個鍊錶,並且返回乙個新的有序的鍊錶 分析 這兩個鍊錶已經有序,所以,只需要對著兩個鍊錶的元素依次進行比較即可,這是對兩個鍊錶操作的基本問題。include stdafx.h include using namespace std struct list...