力扣21题--合并两个有序链表(升序)--C语言
(1)合并两个有序链表
思路:从头开始取两个链表中,取小的尾插到新链表
需要注意的是:链表可以为空,当其中一个链表为空时,直接将一个链表移下来。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
struct ListNode *head=NULL,*tail=NULL;
while(list1!= NULL && list2!=NULL){
if(list1->val<list2->val)
{
if(tail==NULL)
{
head=tail=list1;
}
else
{
tail->next=list1;
tail=tail->next;
}
list1=list1->next;
}
else
{
if(tail==NULL)
{
head=tail=list2;
}
else{
tail->next=list2;
tail=tail->next;
}
list2=list2->next;
}
}
if(list1!=NULL)
tail->next=list1;
if(list2!=NULL)
tail->next=list2;
return head;
}
实验室里哈啤酒: 不好意思,暂时还没复现,只是看了这篇文献
20232801 刘莹: 博主,想问一下您有复现scaffold算法嘛,或者是在您FedAvg复现的代码基础上对scaffold进行了复现?
实验室里哈啤酒: 累加号右面表示对客户端i上第j类局部原型的加权,其中的权重就是数据集占比决定的,您注意看累加号下面,i属于花体字nj(花体字nj表示具有j类原型的所有客户端数量),故这个公式其实求的是nj个客户端上属于第j类的平均全局原型,而右边的数据集之比只是给局部原型加权而已。
wwwneb: 为什么公式(6)做完加权平均,还用具有j类的客户端数量再一次平均啊??
可以改但没必要: if args.all_clients: print("Aggregation over all clients") w_locals = [w_glob for i in range(args.num_users)] ..... if not args.all_clients: w_locals = [] 对w_locals的初始化是不是多余的?后面就Avg的时候使用了该参数,且与初始化的变量无关