合併兩個有序鍊錶,合併後依然有序

2021-08-17 23:52:01 字數 1582 閱讀 3964

合併兩個有序鍊錶合併之後還是有序的,首先這兩個鍊錶是需要是有序的,也就是說這兩個鍊錶已經排好序了,才能進行合併。但是昨天也寫過氣泡排序的程式了,如果讓你合併兩個不是有序的鍊錶合併之後有序,那可以先將兩個鍊錶進行氣泡排序再進行合併就可以了。

首先明確思路,合併兩個鍊錶有兩種方式,第一種就是建立乙個新的鍊錶,不斷的將原來兩個鍊錶的資料接入新的鍊錶,但是還有另外一種方式就是在原來兩個鍊錶上進行操作,將其中乙個鍊錶的資料不斷的和另乙個鍊錶的資料進行比較,如果第乙個鍊錶的資料比第二個大的話那就將第二個鍊錶的資料放在第乙個鍊錶當前資料的前邊,今天我所寫的**是第一種的方式,第一種相對來說容易理解,並且容易操作。

slistnode* slistmerge(slistnode* list1, slistnode* list2)

else

}if (list1 == null)

}if (list2 == null)}

return head;

}

先看一下**。上來首先判斷是不是會有傳入的兩個鍊錶為空的情況。

while (list1&&list2 )

if ((list1->_data) < (list2->_data))

slistpushback(&new,list1->_data );

list1 = list1->_next;

else

slistpushback(&new, list2->_data);

list2 = list2->_next;

之後進入while迴圈如果有乙個鍊錶為空的話就需要結束迴圈,進入迴圈之後兩個節點的資料進行比較,將其中小的那個的資料通過尾插函式將資料插入新的鍊錶中,之後傳入資料的那個鍊錶的指標就需要向後移動乙個。

if (list1 == null)

while (list2)

slistpushback(&new, list2->_data);

list2 = list2->_next;

if (list2 == null)

while (list1)

slistpushback(&new, list1->_data);

list1 = list1->_next;

如果跳出while迴圈,不排除會存在其中乙個為空,但是另乙個還沒走到鍊錶最後的情況,所以需要將非空的那乙個鍊錶剩下的資料再次通過尾**入新的鍊錶中。

之後返回新鍊錶的頭指標,就可以了。

void slistpushback(slistnode** pphead, datatype x)

else

cur->_next = newnode;

newnode->_next = null;

}}

slistnode* buyslistnode(datatype x)

else

return newnode;

}

這兩個分別是尾插函式和分配空間的函式。

合併兩個有序鍊錶,合併後依然有序

合併兩個有序鍊錶,合併後依舊有序 當第乙個鍊錶是空鍊錶就把它和第二個鍊錶合併,結果是第二個鍊錶 同樣,第二個鍊錶是空表,合 並結果是第乙個鍊錶 如果兩都是空鍊錶,合併結果也是空鍊錶 比較兩個鍊錶的頭結點,小的作為合併後的頭結點,在剩餘節點中,再次比較兩個鍊錶的頭結點 node mergelist n...

合併兩個有序鍊錶,合併後依然有序

問題描述 合併兩個有序鍊錶,合併後依然有序 實現思路 先比較兩個有序鍊錶的頭結點,將值最小的頭結點作為新鍊錶的頭結點,設定兩個新的指標,分別遍歷兩個鍊錶,將值較小的結點尾插到新的鍊錶中 具體 實現如下 typedef int datatype typedef struct slistnodeslis...

合併兩個有序鍊錶,合併後依然有序

合併兩個有序鍊錶,合併後依舊有序 當第乙個鍊錶是空鍊錶就把它和第二個鍊錶合併,結果是第二個鍊錶 同樣,第二個鍊錶是空表,合 並結果是第乙個鍊錶 如果兩都是空鍊錶,合併結果也是空鍊錶 比較兩個鍊錶的頭結點,小的作為合併後的頭結點,在剩餘節點中,再次比較兩個鍊錶的頭結點 node mergelist n...