题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍递增排序。
思路如下:
- 如果list1为空,直接返回list2;
- 若list2为空,返回list1;
- 二者均不为空,比较两个链表的头结点,若list1小于list2,则list1的头结点为合并后的链表的头结点(反之),以此类推·,直到两个链表遍历完毕。
测试用例:
- 输入链表有多个结点,结点值互不相同或存在多个相同值。
- 两个链表的一个或两个头结点为NULL指针,两链表只有一个结点
代码实现为:
方法一:递归
#include <windows.h>
#include <assert.h>
#include "SList.h"
SListNode* MergeList(SListNode* list1, SListNode* list2)
{
//list1为空
if (list1 == NULL)
{
return list2;
}
//list2为空
else if (list2 == NULL)
{
return list1;
}
//都不为空
SListNode* MergeNode = NULL;
//list1头结点<list2头结点
if (list1->_data < list2->_data)
{
MergeNode = list1;
MergeNode->_next = MergeList(list1->_next, list2);
}
else
{
MergeNode = list2;
MergeNode->_next = MergeList(list2->_next, list1);
}
return MergeNode;
}
int main()
{
SListNode* list1 = NULL;
SListNode* list2 = NULL;
SListPushBack(&list1, 1);
SListPushBack(&list1, 2);
SListPushBack(&list1, 3);
SListPushBack(&list1, 4);
SListPrint(list1);
SListPushBack(&list2, 3);
SListPushBack(&list2, 4);
SListPushBack(&list2, 7);
SListPushBack(&list2, 8);
SListPrint(list2);
SListNode* list=MergeList(list1,list2);
SListPrint(list);
system("pause");
return 0;
}
方法二:循环
#include <windows.h>
#include <assert.h>
#include "SList.h"
SListNode* MergeList(SListNode* list1, SListNode* list2)
{
SListNode* tail = NULL;
SListNode* list = NULL;
//尾插法
//取较小的做新链表的头结点
if (list1->_data < list2->_data)
{
tail = list = list1;
list1 = list1->_next;
}
else
{
tail = list = list2;
list2 = list2->_next;
}
//查找下一结点
while (list1&&list2)
{
if (list1->_data < list2->_data)
{
tail->_next = list1;
list1 = list1->_next;
}
else
{
tail->_next = list2;
list2 = list2->_next;
}
tail = tail->_next;
}
if (list1)
tail->_next = list1;
if (list2)
tail->_next = list2;
return list;
}
int main()
{
SListNode* list1 = NULL;
SListNode* list2 = NULL;
SListPushBack(&list1, 1);
SListPushBack(&list1, 2);
SListPushBack(&list1, 3);
SListPushBack(&list1, 4);
cout << "list1:" ;
SListPrint(list1);
SListPushBack(&list2, 5);
SListPushBack(&list2, 6);
SListPushBack(&list2, 7);
SListPushBack(&list2, 8);
cout << "list2:" ;
SListPrint(list2);
SListNode* list=MergeList(list1,list2);
cout << "list:" ;
SListPrint(list);
system("pause");
return 0;
}
结果为: