合并两递增链表

原创 2016年08月30日 15:49:26

一、循环实现

#include <iostream>

using namespace std;

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
};

class Solution {
public:
	ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
		ListNode *Head = NULL;
		//输入合法性检测
		if (pHead1 == NULL){
			return pHead2;
		}
		if (pHead2 == NULL) {
			return pHead1;
		}
		//判断合并链表头节点是从哪个节点开始
		if (pHead1->val <= pHead2->val) {
			Head = pHead1;
		} 
		else {
			Head = pHead2;
		}
		ListNode *preHead = NULL, *nextHead = NULL;
		while (pHead1 != NULL && pHead2 != NULL) {
			if (pHead1->val <= pHead2->val) {
				while (pHead1 != NULL && pHead1->val <= pHead2->val) {
					preHead = pHead1;//临时保存链表1遍历的上一个节点
					pHead1 = pHead1->next;
				}
				preHead->next = pHead2;//链表1遍历的上一个节点后继链表2当前节点(插入节点开始)
				nextHead = pHead2->next;//临时保存链表2当前节点的下一个节点
				pHead2->next = pHead1;//链表2当前节点后继链表1当前节点(插入节点完成)
				pHead1 = preHead->next;//链表1当前节点退回到刚插入进去的节点
				pHead2 = nextHead;//链表2当前节点后移
			}
			else {
				while (pHead2 != NULL && pHead2->val < pHead1->val) {
					preHead = pHead2;
					pHead2 = pHead2->next;
				}
				preHead->next = pHead1;
				nextHead = pHead1->next;
				pHead1->next = pHead2;
				pHead2 = preHead->next;
				pHead1 = nextHead;
			}
		}
		return Head;
	}
};

int main(void)  
{  
	ListNode a1(8), a2(12),
		     b1(5), b2(6), b3(7), b4(9);
	a1.next = &a2;

	b1.next = &b2;
	b2.next = &b3;
	b3.next = &b4;
	Solution s;
	ListNode *Head = NULL;
	Head = s.Merge(&a1, &b1);
	return 0;  
}
二、递归实现

#include <iostream>

using namespace std;

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
};

class Solution {
public:
	ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
		ListNode *Head = NULL;
		//输入合法性检测,也作为递归的终止条件
		if (pHead1 == NULL){
			return pHead2;
		}
		if (pHead2 == NULL) {
			return pHead1;
		}
		/*
		 拿情况pHead1->val <= pHead2->val为例进行说明:
		 Merge(pHead1->next, pHead2)返回的肯定是已经排好序的链表(假设是X),
		 由于当前pHead1->val <= pHead2->val,所以只有pHead1能拿到后继X的资格
		*/
		if (pHead1->val <= pHead2->val) {
			pHead1->next = Merge(pHead1->next, pHead2);
			return pHead1;
		}
		else {
			pHead2->next = Merge(pHead1, pHead2->next);
			return pHead2;
		}
	}
};

int main(void)  
{  
	ListNode a1(8), a2(12),
		     b1(5), b2(6), b3(7), b4(9);
	a1.next = &a2;

	b1.next = &b2;
	b2.next = &b3;
	b3.next = &b4;
	Solution s;
	ListNode *Head = NULL;
	Head = s.Merge(&b1, &a1);
	return 0;  
}





相关文章推荐

合并递增链表

  • 2013年01月10日 16:54
  • 2KB
  • 下载

将两递增链表合并,合并后的链表为递减的顺序

/* * author:王昌帅(山东科技大学) * email:415939252@qq.com * date :2012.11.29 */ #include usi...

数据结构杂记——两个递增有序的单链表合并

两个递增有序的单链表合并 问题描述:已知两个单链表均已递增有序,试将他们合并成一个链表,保持其有序性。 问题分析:依次比对链表的data,按序排列即可 Linklist Combine_link...

数据结构 — 1. 两个非递减有序单链表合并为非递增有序单链表

题目描述: 两个非递减有序单链表合并为非递增有序单链表,不能增加新结点,可以增加新指针,不能利用循环链表,不能用顺序表,只能利用单链表本身的结点,通过改变指针的指向来获得结果。 #include #...

将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间

合并单链表

将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表

将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表,要求使用原来的两个单链表节点存放合成后的单链表...

将两个非递减的有序链表合并为一个非递增的有序链表

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。 void MergeList(LinkList& La...

已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做

#include //compare.cpp #include "Node.h" #include "SimpleLinkList.h" using namespace std; template ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:合并两递增链表
举报原因:
原因补充:

(最多只允许输入30个字)