有序單鏈表的合併 遞迴和非遞迴方法

2021-08-01 23:37:04 字數 1140 閱讀 3601

已知有兩個有序的單鏈表head1和head2。分別使用遞迴方法和非遞迴的方法合併成乙個有序的單鏈表。

1:遞迴方法。

假設兩個鍊錶:1->3->5;2->4->6.

遞迴的步驟如下:

(1) 比較鍊錶一和鍊錶2的第乙個資料節點,由於1<2,因此將結果鍊錶中的表頭節點指向鍊錶1中的第乙個節點,即資料1所在節點。

(2) 對剩餘的鍊錶1和鍊錶2再呼叫(1)過程,比較得到結果鍊錶的第2個節點,即2與3比較得到2。此時合併的鍊錶節點為1->2.

(3) 遞迴直到兩個鍊錶的節點都被加到結果鍊錶中。

實現的主要函式:

node *mergerecursive(node *head1,node *head2)

else

return head;

}

2:非遞迴方法。

選取兩個鍊錶中長度最短的乙個鍊錶,將最短的鍊錶中的元素一次插入到最長鍊錶中即可。

node* insert_node(node* head,node* item)

if(p==head)//item->datanext=p;

return item;

} q->next=item;//插入到q與p之間

item->next=p;

return head;

}int length(node *head)

return len;

}node *merge(node *head1,node *head2)

else if(length(head1) == length(head2))

else

while(p!=null)

return head;

}

下面是非遞迴方法的測試程式:

int main()

輸出結果如下:

採用遞迴的方法,輸出結果與上面的一樣,,此處就不在加以說明。

實現有序單鏈表的合併,完整**[email protected]:snippets/2431552.git或者

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟2 其中注意,鍊錶是以節點後繼為null...

單鏈表的逆置(遞迴和非遞迴)

include include typedef char linktype typedef struct linklistlinklist void linklistinit linklist head head null void linklistprint linklist head linkl...