迭代法
创建一个头结点,让t指向头结点
每次循环保证t的指向的下一个节点是两链表的节点相比,值小的那一个节点。
若其中一个表已经遍历完了,因为是有序链表,所以直接把另一个链表接到后面。
struct Lian*MergeTwoList_Two(node *L1,node *L2){
if (!L1)
return L2;
if (!L2)
return L1;
struct Lian *head = (struct Lian*)malloc(sizeof(node)),*t = head;
while (L1&&L2){
if (L1->a<=L2->a){
t->next=L1;
L1=L1->next;
}
else{
t->next =L2;
L2=L2->next;
}
t=t->next;
}
if(!L1) t->next=L2;
else if(!L2) t->next=L1;
return head->next;
}
递归法
不要把递归想的太细化,不要向每一步具体做什么,那样会很容易混乱的。可以找到一个大体的规律,假设当前的节点是p,这个题的规律大致就是,p->next每次都指向——p->next的数值和另一个链表的当前节点的数值相比较小的那一个节点。
规律找到了,怎么开始写代码,可以先实现简单化一点的,简单化的也属于找到的规律的。所以最简单的情况就是其中的一个链表是空的,所以直接返回另一个链表即可。
之后就是将找到的规律代码化。p->next每次都指向——p->next的数值和另一个链表的当前节点的数值相比较小的那一个节点。
struct Lian*MergeTwoList(node *L1,node *L2)
{
if(L1==NULL) return L2;
else if(L2==NULL) return L1;
else if(L1->a<L2->a)
{
L1->next=MergeTwoList(L1->next,L2);//MergeTwoList(L1,L2)返回的是两个里面值比较小的那个节点
return L1;//MergeTwoList(L1,L2)返回的是
}
else
{
L2->next=MergeTwoList(L1,L2->next);
return L2;
}
}