题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(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
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
ListNode* merge(ListNode* pHead1,ListNode* pHead2)
{
if(pHead1==NULL)
return pHead2;
if(pHead2==NULL)
return pHead1;
ListNode* pMergeHead=NULL;
if(pHead1->m_nValue<pHead2->m_nValue)
{
pMergeHead=pHead1;
pMergeHead->m_pNext = merge(pHead1->m_pNext,pHead2);
}
else
{
pMergeHead=pHead2;
pMergeHead->m_pNext =merge(pHead1,pHead2->m_pNext);
}
return pMergeHead;
}
ListNode* createList(int number)
{
if(number<=0)
return NULL;
ListNode* pHead=NULL;
int headData;
scanf("%d",&headData);
pHead=(ListNode*)malloc(sizeof(ListNode));
if(pHead==NULL)
exit(0);
pHead->m_nValue=headData;
pHead->m_pNext=NULL;
ListNode* pCur=pHead;
for(int i=0;i<number-1;i++)
{
int pData;
scanf("%d",&pData);
ListNode* pNode = (ListNode*)malloc(sizeof(ListNode));
if(pNode==NULL)
exit(0);
pNode->m_nValue=pData;
pNode->m_pNext=NULL;
pCur->m_pNext=pNode;
pCur=pCur->m_pNext;
}
return pHead;
}
int main()
{
int number1,number2;
printf("please input the two number:\n");
scanf("%d %d",&number1,&number2);
ListNode* pHead1 =createList(number1);
ListNode* pHead2 =createList(number2);
ListNode* mergeHead = merge(pHead1,pHead2);
if(mergeHead!=NULL)
{
while(mergeHead!=NULL)
{
printf("%d\t",mergeHead->m_nValue);
mergeHead=mergeHead->m_pNext;
}
}
return 0;
}
结果:
分享到:
相关推荐
总结来说,"PTA 两个有序链表序列的合并"这个题目要求我们掌握链表的基本操作,理解链表的特性,以及如何有效地合并两个有序链表。通过解决这个问题,我们可以加深对链表数据结构的理解,同时锻炼我们的逻辑思维和...
**合并两个有序链表**意味着将两个已排序的链表合并成一个新的、同样有序的链表。 #### 代码解析 接下来,我们将逐行解析给定的C语言代码,并解释其工作原理。 1. **宏定义与头文件包含** ```c #define NULL 0 ...
- 合并两个链表 - 输出链表 2. **选择排序算法**:在本题目的实现中,使用了选择排序来对链表进行排序。虽然对于递增链表来说,排序步骤是多余的,但为了满足题目要求,这里还是进行了排序处理。 3. **链表合并...
合并两个有序链表的目的是创建一个新的有序链表,保持原有的顺序。这个过程通常比单独排序两个链表更有效率,因为链表已经部分有序。 清华大学版数据结构教材中的链表合并算法通常采用迭代或递归的方式。这里我们...
在编程领域,特别是数据结构和算法的学习中,"合并两个有序链表" 是一个常见的问题。这个主题涉及到链表操作,以及两种主要的解决问题的方法:递归和迭代。下面我们将详细探讨这两个方法。 首先,链表是一种数据...
在实际应用中,我们经常需要合并两个有序链表,以便更好地处理和分析数据。 在本文中,我们将详细介绍如何在 C++ 中合并两个有序链表。我们将讨论非递归实现的算法过程,并提供相应的代码实现。 一、题目要求 ...
非递减有序链表指的是链表中的元素按照从小到大的顺序排列,即任何相邻的两个节点,后一个节点的值都不小于前一个节点的值。这种有序性是合并链表操作的基础。 ### 合并链表的算法思路 1. 初始化新的链表C的头节点...
在讨论如何合并两个有序链表之前,我们先简要回顾一下链表的基本概念和操作。链表是一种动态数据结构,它的大小可以根据需要动态地改变。链表中的每个元素(称为节点)都包含两部分:一部分用于存储数据(例如整数、...
合并两个链表时,可以创建一个新的空链表,遍历两个输入链表,将每个非重复元素添加到新链表中。链表的优点在于动态扩展性,但插入操作相对数组较慢。 题目二:求两个有序表的合并算法 两个有序表的合并是数据结构...
以下是合并两个有序链表的C++代码实现: ```cpp ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(-1); // 创建一个虚拟头节点,方便操作 ListNode* tail = &dummy; // 初始化尾指针 ...
在给定的编程问题中,任务是合并两个已经按升序排列的单链表,创建一个新的升序链表。这是一个常见的算法问题,通常出现在数据结构和算法的学习中,例如LeetCode等在线编程挑战平台。这个问题涉及到链表的操作,包括...
3. **归并两个有序线性表**:接下来,需要实现两个有序线性表的归并操作,即将两个有序线性表合并成一个新的有序线性表。 4. **输出归并后的有序线性表**:最后,程序需要输出归并后的有序线性表。 #### 存储结构的...
最坏情况下,当一个链表中的所有元素都比另一个链表中的小或大时,时间复杂度为O(n^2),其中n为两个链表的总长度。然而,在实践中,尤其是当链表已部分排序时,性能会更好。 #### 五、应用场景与扩展 - **学生信息...
本例中要实现的是将两个递增的链表按照逆序合并成一个递减的链表。逆序合并的算法通过比较两个链表的节点数据,按照递减的顺序将节点链接起来。具体步骤如下: 1. 创建一个空的链表C,用于存放合并后的结果。 2. ...
接下来是合并两个有序单链表的过程。这个操作可以在线性时间内完成,复杂度为O(m+n),其中m和n分别是两个链表的长度。基本思想是从两个链表的头节点开始比较,选取较小的节点作为新链表的当前节点,然后移动较小节点...
- 合并:两个有序链表的合并通常采用迭代或递归方式,比较每个链表头部元素,较小的元素作为新链表的头部,直至其中一个链表为空,然后将另一个链表附加到结果链表上。 - 倒置:链表的倒置可以通过三次遍历来实现...
这个过程会一直持续到所有子链表都只剩一个节点,最后再将这些单节点链表合并成一个大的有序链表。 对于链表的合并,假设我们有两个已排序的链表`list1`和`list2`,我们可以创建一个新的空链表`mergedList`作为结果...
这个“python-leetcode面试题解之合并两个有序链接.zip”压缩包显然包含了针对LeetCode中关于合并两个有序链表问题的Python解法。这个问题是数据结构和算法领域中的经典题目,常在面试中被用来评估候选人的解决问题...
以下是合并两个有序链表的基本步骤: 1. **初始化**: 创建两个指针,分别指向两个链表的头节点。 2. **比较节点值**:比较两个链表当前节点的值,选择较小的一个,并将其作为新链表的当前节点。 3. **移动指针**:...
在这个问题中,我们关注的是如何使用PHP来合并两个已排序的链表,使得合并后的链表依然保持有序状态。 首先,我们需要理解链表节点的结构。在PHP中,可以定义一个名为`ListNode`的类来表示链表节点,它包含两个属性...