C++合併兩個有序的單鏈表
阿新 • • 發佈:2019-01-11
一直看到的都是合併的函式,卻沒有看到完整的輸入輸出啥樣的,今天自己寫一個,包含連結串列的初始化
// 合併兩個有序連結串列.cpp : 定義控制檯應用程式的入口點。 #include "stdafx.h" #include <iostream> using namespace std; struct ListNode{ int val; ListNode* next; }; ListNode* initList1(ListNode* head){//初始化第一個連結串列 ListNode* node1 = new ListNode(); node1->val = 2; head->next = node1; ListNode* node2 = new ListNode(); node2->val = 3; node1->next = node2; ListNode* node3 = new ListNode(); node3->val = 6; node2->next = node3; ListNode* node4 = new ListNode(); node4->val = 8; node3->next = node4; return head; }//initList1 ListNode* initList2(ListNode* head){//初始化第二個連結串列 ListNode* node1 = new ListNode(); node1->val = 1; head->next = node1; ListNode* node2 = new ListNode(); node2->val = 2; node1->next = node2; ListNode* node3 = new ListNode(); node3->val = 4; node2->next = node3; ListNode* node4 = new ListNode(); node4->val = 5; node3->next = node4; return head; }//initList2 //從頭至尾遍歷單鏈表 void visitList(ListNode* head){ while(head!= NULL){ cout<<head->val<<endl; head= head->next; } }//visitList //合併連個有序連結串列 ListNode* mergerTwoSortedList(ListNode* head1,ListNode* head2){ ListNode* head = new ListNode();//head指標是每次後移的 ListNode* firstNode = head;//需要確定好一個不變的頭結點,然後返回這個頭結點的next地址,才能返回完成的連結串列 while(head1!=NULL && head2!=NULL){ if(head1->val > head2->val){ head->next = head2;//這裡只是確定好head->next是哪個結點,head還沒有指向這個結點 head2 = head2->next; }else{ head->next = head1; head1 = head1->next; } head = head ->next;//head指向這個結點 }//while head->next = head1?head1:head2;//遇到一個為空後,哪個不為空就next指向哪一個 //return head->next;//輸出是:7 8 ,因為head指標也在往後移動 return firstNode->next; }//mergerTwoSortedList int _tmain(int argc, _TCHAR* argv[]) { //函式中初始化 cout<<"第一個連結串列:"<<endl; ListNode* head1 = new ListNode(); head1->val = 0; head1 = initList1(head1); visitList(head1); cout<<"第二個連結串列:"<<endl; ListNode* head2 = new ListNode(); head2->val = -1; head2 = initList2(head2); visitList(head2); cout<<"合併後的新連結串列:"<<endl; ListNode* head = mergerTwoSortedList(head1,head2); visitList(head); return 0; } //第一個連結串列: //0 //2 //3 //6 //8 //第二個連結串列: //-1 //1 //2 //4 //5 //合併後的新連結串列: //-1 //0 //1 //2 //2 //3 //4 //5 //6 //8 //請按任意鍵繼續. . .
單步除錯發現:
firstNode指標儲存的值並沒有改變,是剛開始時head的地址,
head每次在後移,地址是改變的,所以最後是return firstNode->next,才能返回完整連結串列