1. 程式人生 > >C++合併兩個有序的單鏈表

C++合併兩個有序的單鏈表

一直看到的都是合併的函式,卻沒有看到完整的輸入輸出啥樣的,今天自己寫一個,包含連結串列的初始化

// 合併兩個有序連結串列.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,才能返回完整連結串列