版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hansionz/article/details/82285855
0.题目
输入两个递增排序的链表,合并这两个链表并使得新的链表依然是递增有序的。
1.解题思路
- 递归方法:首先比较给新链表接上一个结点,然后这个结点的next就是剩下的两条链表合并的结果。
pNode Merge_R(pLinkList list1, pLinkList list2)
{
//处理链表为空
if (list1 == NULL)
{
return list2;
}
else if (list2 == NULL)
{
return list1;
}
//递归合并
pLinkList newhead = NULL;
if (list1->data < list2->data)
{
newhead = list1;
newhead->next = Merge_R(list1->next, list2);
}
else
{
newhead = list2;
newhead->next = Merge_R(list1, list2->next);
}
return newhead;
}
- 非递归:单词比较一个一个接到新链表上,最后把剩余的结点连上就可以了。但是对于无头单链表,首先要接一个结点,以后的操作才可以统一。
pNode Merge(pLinkList list1, pLinkList list2)
{
pLinkList newhead = NULL;
//一个链表为空,另一个不为空或者两个链表都为空
if (list1 == NULL)
{
return list2;
}
else if (list2 == NULL)
{
return list1;
}
//无头结点的单链表,必须先插入一个结点才能将以后的结点操作统一
if (list1->data < list2->data)
{
newhead = list1;
list1 = list1->next;
}
else
{
newhead = list2;
list2 = list2->next;
}
//保存链表最后一个结点的位置
pNode tail = newhead;
//依次比较尾插
while ((list1 != NULL) && (list2 != NULL))
{
if (list1->data < list2->data)
{
tail->next = list1;
list1 = list1->next;
}
else
{
tail->next = list2;
list2 = list2->next;
}
tail = tail->next;
}
//将剩余的结点插入到新链表中
if (list1 == NULL)
{
tail->next = list2;
}
else if (list2 == NULL)
{
tail->next = list1;
}
return newhead;
}