有两个不带头结点的单链表,且数据元素为整数型,且递增有序。 (此时假设它输入的时候就已经是递增有序的单链表了)
算法实现目标:将这两个单链表合并为一个递减有序的单链表
思路:可以利用这两个链表本来就是递增有序的特性进行合并,然后再进行逆序,即可得到递减有序链表。
链表类:
//链表类
class List {
public:
int val;
List* next;
public:
List() : val(0), next(nullptr) {
}
List(int x) : val(x), next(nullptr) {
}
List(int x, List* next) : val(x), next(next) {
}
};
合并链表函数
使用了3个指针:now,p1,p2
1.先比较两个链表头结点的数值的大小,选择更小者作为新链表的头结点。
2.此后设置now指向新链表的当前结点,而p1指向链表1未加入新链表的结点,p2指向链表2未加入新链表的结点。
3.p1和p2进行数值比较,选择结点值更小的加入新链表,而p1/p2要指向p1->next/p2->next(即往前移)
4.以此类推,最后有3种情况,即链表1和链表2都全并入新链表或 链表1加入新链表 或 链表2加入新链表。只需要判断p1和p2哪个为空,在now后面接上剩余链表即可(因为已经有序了)
个人觉得该思路的好处是一次遍历即可合并,并且不用额外空间
//该函数作用:合并递增链表为一个新的递增链表
int MergeList1(List* l1, List* l2) {
//先判断l1、l2是否为空节点
if (l1 == nullptr && l2 == nullptr)
return 0;
if (l1 == nullptr) return 2;
if (l2 == nullptr) return 1;
List *head,*now<