已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数 linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的 带头结单链表作为函数的返回结果; 设计算法函数linklist mergeDescend (linklist L1,linklist L2) 将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;
时间: 2023-05-28 07:05:51 浏览: 114
算法思路:
对于两个带头结点的单链表L1和L2,合并成一个新的带头结点的单链表L3,可以采用以下算法:
1. 分别定义三个指针p1、p2、p3,分别指向L1、L2、L3的头结点。
2. 从L1和L2的第一个结点开始比较,将较小的结点插入到L3的尾部,同时将指向该结点的指针后移一位。
3. 重复步骤2,直到L1或L2的结点全部插入到L3。
4. 如果L1或L2还有剩余结点,则将剩余的结点插入到L3的尾部。
5. 返回合并后的L3。
对于升序合并,按照上述算法即可;对于降序合并,只需要在步骤2中将较大的结点插入到L3的尾部即可。
算法实现:
```
/* 升序合并 */
linklist mergeAscend (linklist L1, linklist L2) {
linklist L3 = (linklist)malloc(sizeof(LNode));
L3->next = NULL;
LNode *p1 = L1->next, *p2 = L2->next, *p3 = L3;
while (p1 && p2) {
if (p1->data <= p2->data) {
p3->next = p1;
p1 = p1->next;
} else {
p3->next = p2;
p2 = p2->next;
}
p3 = p3->next;
}
p3->next = p1 ? p1 : p2;
free(L1);
free(L2);
return L3;
}
/* 降序合并 */
linklist mergeDescend (linklist L1, linklist L2) {
linklist L3 = (linklist)malloc(sizeof(LNode));
L3->next = NULL;
LNode *p1 = L1->next, *p2 = L2->next, *p3 = L3;
while (p1 && p2) {
if (p1->data >= p2->data) {
p3->next = p1;
p1 = p1->next;
} else {
p3->next = p2;
p2 = p2->next;
}
p3 = p3->next;
}
p3->next = p1 ? p1 : p2;
free(L1);
free(L2);
return L3;
}
```
阅读全文