题目:合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入: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;
}