合并两个有序链表

题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

(hint: 请务必使用链表。)

输入:

输入可能包含多个测试样例,输入以EOF结束。

对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。

下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。

输出:

对应每个测试案例,

若有结果,输出相应的链表。否则,输出NULL。

样例输入:
5 2
1 3 5 7 9
2 4
0 0
样例输出:
1 2 3 4 5 7 9
NULL
----------------------------------------------------

很基础的题目,必须能够迅速写出。

非递归版本:

/*****************************
有序链表合并
by Rowandjj
2014/7/16
*******************************/
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef struct Node
{
	int data;
	struct Node *next;
}Node,*List;
Node* MergeList(List la,List lb)
{
	List lc;
	if(!la)
	{
		return lb;
	}else if(!lb)
	{
		return la;
	}
	Node *pa = la,*pb = lb,*pc;
	if(pa->data < pb->data)
	{
		pc = pa;
		pa = pa->next;
	}else
	{
		pc = pb;
		pb = pb->next;
	}
	lc = pc;
	while(pa && pb)
	{
		if(pa->data < pb->data)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}else
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;
	return lc;
}
int main()
{
	int n,m,i;
	int data;
	while(scanf("%d %d",&n,&m) != EOF)
	{
		Node *pCur;
		List nL = NULL;
		if(n>0)
		{
			nL = (Node*)malloc(sizeof(Node));
			if(!nL)
			{
				exit(0);
			}
			cin>>data;
			nL->data = data;
			nL->next = NULL;

			pCur = nL;
			for(i = 0; i < n-1; i++)
			{
				Node *newNode = (Node*)malloc(sizeof(Node));
				if(!newNode)
				{
					exit(-1);
				}
				cin>>data;
				newNode->data = data;
				newNode->next = NULL;
				pCur->next = newNode;
				pCur = newNode;
			}
		}
		List mL = NULL;
		if(m>0)
		{
			mL = (List)malloc(sizeof(Node));
			if(!mL)
			{
				exit(0);
			}
			cin>>data;
			mL->data = data;
			mL->next = NULL;
			pCur = mL;
			for(i = 0; i < m-1; i++)
			{
				Node *nodeNew = (Node*)malloc(sizeof(Node));
				if(!nodeNew)
				{
					exit(-1);
				}
				cin>>data;
				nodeNew->data = data;
				nodeNew->next = NULL;
				pCur->next = nodeNew;
				pCur = nodeNew;
			}
		}

		List newList = MergeList(nL,mL);
		if(newList != NULL)
		{
			Node *p = newList;
			while(p)
			{
				if(p->next == NULL)
				{
					cout<<p->data<<endl;
				}else
				{
					cout<<p->data<<" ";
				}

				p = p->next;
			}
		}else
		{
			cout<<"NULL"<<endl;
		}
	}
	return 0;
}

递归版本(主函数略):

//递归版本
Node* MergeList_2(List la,List lb)
{
	if(!la)
	{
		return lb;
	}else if(!lb)
	{
		return la;
	}
	Node *phead = NULL;
	if(la->data < lb->data)
	{
		phead = la;
		phead->next = MergeList_2(la->next,lb);
	}else
	{
		phead = lb;
		phead->next = MergeList_2(la,lb->next);
	}
	return phead;
}

合并两个有序链表,布布扣,bubuko.com

时间: 2024-10-08 23:39:21

合并两个有序链表的相关文章

链表(14)----合并两个有序链表

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.合并两个有序链表 ListElement_t * MergeList( ListElement_t *

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

[leetcode] 21. 合并两个有序链表

21. 合并两个有序链表 两个有序链表合并为一个新的有序链表 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode ans = new ListNode(Integer.MAX_VALUE); ListNode p = ans; while (l1 != null && l2 != null) { if (l1.val < l2.val) { p.next = l1; l

[LeetCode]21 Merge Two Sorted Lists 合并两个有序链表

---恢复内容开始--- [LeetCode]21 Merge Two Sorted Lists 合并两个有序链表 Description Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. Example Example: Input: 1->2->4, 1-&g

leecode刷题(23)-- 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路: 这道题我们可以用递归的方法来处理.首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比较.如果 l1 对应的节点小于或等于 l2 对应的节点,则将 head

LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode21. Merge Two Sorted Lists 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 Java 实现 ListNode 类 class ListNode { int val; ListNode n

LeetCode - 合并两个有序链表(No.21)

21 - 合并两个有序链表 date: Dec.28th, 2019 platform: windows thinking a recursive method is implemented. code /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListN

每天AC系列(七):合并两个有序链表

1 题目 LeetCode第21题,合并两个有序链表. 2 直接合并 因为已经有序了,类似归并排序中的合并一样,操作不难,直接上代码了. ListNode t = new ListNode(0); ListNode head = t; while(l1 != null && l2 != null) { if(l1.val < l2.val) { t.next = l1; l1 = l1.next; } else { t.next = l2; l2 = l2.next; } t = t

经典算法学习——合并两个有序链表

类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型.题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的.我这里以合并链表来实现. 在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表.简单的示意图如下: 当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推.直到某一个链表为空时,把另一个链表全部接