题目:输入两个递增排列的单链表,合并这两个链表,并使新链表中的节点仍然是递增排序的。ios
首先,分析从合并两个链表的头结点开始,若是链表 1 的头结点的值小于链表 2 的头结点的值。所以,链表 1 的头结点将是合并后链表的头结点。继续合并两个链表中的剩余节点,在两个链表中,剩下的节点仍然是排序的。所以合并这两个链表的过程与前面的步骤是同样的,仍是要比较两个头结点的值。spa
当获得两个链表中值较小的头结点并把它链接到已经合并的链表以后,两个链表剩余的节点仍然是排序的,这就是典型的递归过程。指针
接下来解决鲁棒问题。每当代码试图访问空指针指向的内存时程序就会崩溃,从而致使鲁棒问题。在本题中一旦输入空的链表指针就会引入空指针,所以,须要对空链表进行单独处理。当第一个链表是空链表时(即它的头指针为 NULL),那么把它和第二个链表合并,显然合并的结果就是第二个链表。一样,当输入的第二个链表为空时,它和第一个链表合并的结果也就是第一个链表。若是两个链表都是空链表,则合并以后的链表仍然为空链表。排序
//合并两个已排序的单链表
#include<iostream>
using namespace std;递归
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}ListNode, *LinkList;内存
LinkList InitializeLinkList(ListNode *L)
{
if(L == NULL)
{
L = new ListNode();
L->next = NULL;
}
return L;
}it
void CreateLinkList(LinkList L, ElemType e)
{
if(L == NULL)
return;
ListNode *p, *s;
s = L;
while(s->next != NULL)
s = s->next;
p = new ListNode();
p->data = e;
p->next = NULL;
s->next = p;
}io
void PrintLinkList(LinkList L)
{
ListNode *p;
p = L->next;
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}stream
//递归合并两个单链表
ListNode* MergeTwoLinkList(LinkList L1, LinkList L2)
{
if(L1 == NULL) //输入的一个链表为空时,返回另外一个链表的头结点
return L2;
if(L2 == NULL)
return L1;
ListNode *head = NULL;
ListNode *p = L1;
ListNode *q = L2;List
if(p->data > q->data)
{
head = q;
head->next = MergeTwoLinkList(p, q->next);
}
else
{
head = p;
head->next = MergeTwoLinkList(p->next, q);
}
return head;
}
int main()
{
ListNode *L1 = NULL, *L2 = NULL, *mergeHead = NULL;
L1 = InitializeLinkList(L1);
L2 = InitializeLinkList(L2);
for(int i = 2; i < 10; i += 2)
{
CreateLinkList(L1, i);
}
for(int j = 1; j < 10; j += 2)
{
CreateLinkList(L2, j);
}
cout << "链表1:";
PrintLinkList(L1);
cout << "链表2:";
PrintLinkList(L2);
mergeHead = MergeTwoLinkList(L1->next, L2->next); //是有带有头结点的单链表
cout << "合并以后的链表:";
ListNode *s = mergeHead;
while(s != NULL)
{
cout << s->data << " ";
s = s->next;
}
cout << endl;
system("pause"); return 0;}