合併兩個有序的單鏈表,合併後依然有序

2021-08-25 22:21:08 字數 1717 閱讀 7507

分析過程:

首先我要合併有序的鍊錶,合併後依然有序。我就要有兩個指標,分別指向兩個鍊錶,觀察所給的兩個鍊錶是公升序還是降序的來確定合併後的鍊錶是否有序。(這裡預設的認為鍊錶時公升序的)

用指標分別指向兩個鍊錶的第乙個節點,比較大小,那個大,將元素尾插進入我所要返回的新鍊錶中去。一次比較迴圈往復,直至某乙個鍊錶為空為止。但有可能會出現乙個鍊錶為空,另乙個鍊錶不為空。我們就要在最後檢測,將不為空鍊錶的全部掛在我要返回元素的後面。因為要不停的給新鍊錶尾插。所以我用乙個指標,將新鍊錶的尾部標記。

**如下所示

//合併兩個有序鍊錶,合併後依然有序的測試

slinklist*

mergelinklist

(slinklist* phead1, slinklist* phead2)

else

cur1->_pnext =

null

;//尾插,鍊錶的最後乙個元素應為空

//儲存新鍊錶的最後乙個節點

tail = cur1;

cur1 = nxt;

}else

else

cur2->_pnext =

null

;//尾插,鍊錶的最後乙個元素應為空

//儲存新鍊錶的最後乙個節點

tail = cur2;

cur2 = nxt;}}

//乙個鍊錶空了,但要判斷裡另乙個鍊錶為不為空

if(cur1 ==

null)if

(cur2 ==

null

)return new;

}

由於這個**有許多重複的步驟,優化可得

slinklist*

mergelinklistop

(slinklist* phead1, slinklist* phead2)

else

//儲存cur1後面的節點:將cur1指向的結點從鍊錶1上取下來,掛在新鍊錶上,後序的鍊錶應該儲存下來,否則程式會奔潰

nxt = node->_pnext;

if(new ==

null

)else

node->_pnext =

null

;//尾插,鍊錶的最後乙個元素應為空

//儲存新鍊錶的最後乙個節點

tail = node;

//已經將節點掛在新鍊錶上,迴圈應該讓cur1 和 cur2如改變,因此在這裡應該讓cur前進

if(node == cur1)

else

}//乙個鍊錶空了,但要判斷裡另乙個鍊錶為不為空

if(cur1 ==

null

) tail->_pnext = cur2;

if(cur2 ==

null

) tail->_pnext = cur1;

return new;

}

鍊錶結構、測試**、執行結果
typedef

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

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

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

合併兩個有序鍊錶合併之後還是有序的,首先這兩個鍊錶是需要是有序的,也就是說這兩個鍊錶已經排好序了,才能進行合併。但是昨天也寫過氣泡排序的程式了,如果讓你合併兩個不是有序的鍊錶合併之後有序,那可以先將兩個鍊錶進行氣泡排序再進行合併就可以了。首先明確思路,合併兩個鍊錶有兩種方式,第一種就是建立乙個新的鍊...

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

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