合并两递增链表

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





数据结构之将两个递增的有序链表合并为一个递增的有序链表

数据结构之将两个递增的有序链表合并为一个递增的有序链表标签(空格分隔): 学习笔记 数据结构题目 将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占...
  • mysslz
  • mysslz
  • 2015年04月02日 16:31
  • 3365

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

将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。 void MergeList(LinkList &La,...
  • sinat_25926481
  • sinat_25926481
  • 2015年10月11日 12:29
  • 8496

将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)

将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。 #include #include typedef s...
  • sinat_25926481
  • sinat_25926481
  • 2015年10月11日 15:30
  • 5193

合并递增链表

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

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

/* * author:王昌帅(山东科技大学) * email:415939252@qq.com * date :2012.11.29 */ #include usi...
  • wangchangshuai0010
  • wangchangshuai0010
  • 2012年11月29日 14:38
  • 2049

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

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

利用单链表创建多项式,并实现多项式的加减乘法运算,以及对多项式根据指数进行递增排序

  • 2014年05月25日 17:01
  • 171KB
  • 下载

已知单链表L为按值递增有序的,编写算法将数据元素e插入到顺序表L中,使之仍有序

  • 2010年04月10日 08:51
  • 2KB
  • 下载

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

#include //compare.cpp #include "Node.h" #include "SimpleLinkList.h" using namespace std; template ...
  • leafinsnowfield
  • leafinsnowfield
  • 2015年09月30日 12:41
  • 1697

将两个递增的链表合并成一个递减的链表(相同的元素只留下一个),并要求利用原表结点

原题:已知两个链表A和B,其元素值递增排序,编程将A和B合并成一个递减有序(相同元素只留下一个)的链表C,并要求利用原表节点。 分析:该程序是由LNode *MergeList()函数完成题设要求的,...
  • huanfengyun
  • huanfengyun
  • 2013年05月31日 23:49
  • 1489
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:合并两递增链表
举报原因:
原因补充:

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