总结:
1、我自己的代码能力太垃圾,要是自己苦思冥想,花了好长时间,写出一个垃圾代码,即使通过了。学习的性价比也太低了,我现在要做的是,多读代码多学习,多借鉴大佬的。
2、具体做法:a、思考四五分钟,没啥思路。找大佬的代码看懂,然后复现。b、有思路,自己写一下,遇到坎,看看大佬怎么写的,不要硬着头皮上,效率是第一位。先把这些具体实现一遍,再完完全全自己刷题!
List Merge( List L1, List L2 )
{
List pa, pb, pc, L;
L=(List)malloc(sizeof(struct Node));
pa=L1->Next;
pb=L2->Next;
pc=L;
while(pa&&pb)
{
if(pa->Data>=pb->Data)
{
pc->Next=pb;
pc=pb;
pb=pb->Next;
}
else
{
pc->Next=pa;
pc=pa;
pa=pa->Next;
}
}
pc->Next=pa?pa:pb;
L1->Next=NULL;
L2->Next=NULL;
return L;
}
写于2021-3-26 20:48
题目:L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针S。
思路:返回的链表S的第一个节点的元素,应是L1和L2中所有元素中最小的元素。而L1与L2中最小的元素是L1中的第一个节点元素或L2中第一个节点元素,故返回的链表S的第一个元素应该是上述两个元素中较小者。
List Merge( List L1, List L2 )
{
List S=(List)malloc(sizeof(struct Node)),tepS,tail=S;//可以把teps和tail合并成一个,但这样写起来过于凌乱
while(L1->Next!=NULL&&L2->Next!=NULL){//可改为L->Next&&L2->Next
if(L1->Next->Data<L2->Next->Data){
tepS=L1->Next;
L1->Next=L1->Next->Next;
tepS->Next=NULL;
}
else{
tepS=L2->Next;
L2->Next=L2->Next->Next;
tepS->Next=NULL;
}
tail->Next=tepS;
tail=tepS;
}
//下面两个while可以改为tail->Next=L1->Next?L1->Next:L2->Next;
while(L1->Next!=NULL){
tepS=L1->Next;
L1->Next=L1->Next->Next;
tepS->Next=NULL;
tail->Next=tepS;
tail=tepS;
}
while(L2->Next!=NULL){
tepS=L2->Next;
L2->Next=L2->Next->Next;
tepS->Next=NULL;
tail->Next=tepS;
tail=tepS;
}
L1->Next=NULL;
L2->Next=NULL;
return S;
}
写于 2021-03-28 17:57