合并两个有序链表 C++算法 leetcode21

题目:合并两个有序链表 

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解答:

①具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中;

②由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素;

③直接另一个未完成的链表直接链入新链表的末尾。

代码示例:

①首先是Node结点的建立

struct ListNode{
	int val;
	ListNode* next;
};

②初始化两个要用的链表 initlist1&initlist2

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;  
}

 代码运行结果:

源代码:

//#include "stdafx.h"
#include <tchar.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;
}

 

猜你喜欢

转载自blog.csdn.net/qq_37648020/article/details/86672457