您好,登錄后才能下訂單哦!
輸入兩個遞增排序的鏈表,合并這兩個鏈表并使新鏈表中的結點仍然是按照遞增排序的。
要合并兩個遞增的鏈表,首先找出兩個鏈表的頭結點中較小的一個就為合并后新鏈表的頭結點,之后再依次將兩個鏈表中的結點值進行相比較,依次將較小值在新鏈表中進行尾插,直到其中一個鏈表遍歷完成,將剩余鏈表直接鏈在新鏈表的尾部就可以了,因為鏈表本來就是有序遞增的;
程序設計如下:
#include <iostream> #include <assert.h> using namespace std; template <class T> struct ListNode//鏈表結點結構 { T _data; ListNode<T>* _next; }; template <class T> ListNode<T>* buy_node(T data)//創建一個鏈表結點 { ListNode<T>* tmp = new ListNode<T>; tmp->_data = data; tmp->_next = NULL; return tmp; } template <class T> void init_list(ListNode<T>** node, T data)//初始化鏈表 { *node = buy_node(data); } template <class T> void push_node(ListNode<T>*& head, T data)//插入鏈表結點 { if(head == NULL) { init_list(&head, data); return; } ListNode<T>* tmp = head; while(tmp->_next != NULL) { tmp = tmp->_next; } tmp->_next = buy_node(data); } template <class T> void print_list(ListNode<T>* head)//打印鏈表 { while(head != NULL) { cout<<head->_data<<"->"; head = head->_next; } cout<<"NULL"<<endl; } template <class T> void destroy_list(ListNode<T>*& head)//銷毀鏈表 { if(head != NULL) { ListNode<T>* cur = head; ListNode<T>* tmp = head; while(cur != NULL) { tmp = cur; cur = cur->_next; delete tmp; } head = NULL; } } //實現1:循環 template <class T> ListNode<T>* MergeList(ListNode<T>* list1, ListNode<T>* list2) { if(list1 == NULL)//條件判斷 return list2; else if(list2 == NULL) return list1; ListNode<T>* newHead = NULL; ListNode<T>* tmp1 = NULL; ListNode<T>* tmp2 = NULL; if(list1->_data <= list2->_data)//決定新鏈表的頭結點 { newHead = list1; tmp1 = list1->_next; tmp2 = list2; } else { newHead = list2; tmp1 = list1; tmp2 = list2->_next; } ListNode<T>* cur = newHead; while((tmp1 != NULL) && (tmp2 != NULL)) { if(tmp1->_data <= tmp2->_data)//將較小值進行尾插 { cur->_next = tmp1; cur = cur->_next; tmp1 = tmp1->_next; } else { cur->_next = tmp2; cur = cur->_next; tmp2 = tmp2->_next; } } if(tmp1 == NULL)//將剩下的鏈表直接接在新鏈表后面 cur->_next = tmp2; else cur->_next = tmp1; return newHead; } //實現2:遞歸 template <class T> ListNode<T>* MergeList(ListNode<T>* list1, ListNode<T>* list2) { if(list1 == NULL)//條件判斷 return list2; else if(list2 == NULL) return list1; ListNode<T>* newHead = NULL; if(list1->_data <= list2->_data) { newHead = list1; newHead->_next = MergeList(list1->_next, list2); } else { newHead = list2; newHead->_next = MergeList(list1, list2->_next); } return newHead; } int main() { ListNode<int>* list1 = NULL; push_node(list1, 1); push_node(list1, 2); push_node(list1, 3); push_node(list1, 8); push_node(list1, 11); push_node(list1, 14); ListNode<int>* list2 = NULL; push_node(list2, 5); push_node(list2, 6); push_node(list2, 7); push_node(list2, 8); push_node(list2, 9); cout<<"list1: "; print_list(list1); cout<<"list2: "; print_list(list2); ListNode<int>* newhead = MergeList(list1, list2); cout<<"merge list:"; print_list(newhead); destroy_list(list1); destroy_list(list2); return 0; }
運行程序:
從上面程序可以看出來,用遞歸比循環看起來更好理解和簡潔。
《完》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。