Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
来源:互联网 发布:java多线程性能测试 编辑:程序博客网 时间:2024/06/08 19:22
第一次尝试,思路:想象有n列个向量,每当要merge的时候,比较每一列的第一个大小,取下最小的那个节点返回并且将该节点从当前向量中剔除(search函数来完成)。当search函数返回NULL 的时候说明所有的node都被遍历了一边,所以标志着结束。
但是这个算法的复杂度比较高。假设有n个数字,每个数字在被取走之前都会被遍历一次,所以第x大的数字会被遍历x次的,所以复杂度O(n^2)
提醒超时TLE
代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* search(struct ListNode** lists, int size);struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { struct ListNode *head,*forward,*next; head=(struct ListNode*)malloc(sizeof(struct ListNode)); head->next=NULL; forward=head; while((next=search(lists,listsSize))!=NULL){ forward->next=next; forward=next; } //next=NULL,no Node any more; //no need to add the terminated NULL,cause the last node must\ //terminate with a NULL; //forward->next=next; forward=head; head=forward->next; free(forward); return head; }struct ListNode* search(struct ListNode** lists, int size){ struct ListNode* temp=*lists; size_t i=0; int ptr; for(;i!=size;i++){ if(temp==NULL) temp=*(lists+i); else if((*(lists+i)!=NULL)&&((*(lists+i))->val)<(temp->val)) { temp=*(lists+i);//temp save the pointer to smallest val ptr=i; } } if(temp==NULL) return NULL; *(lists+ptr)=temp->next; return temp; }
第二次尝试:为降低复杂度,牺牲存储。将所有的链表的值复制到数组中,利用stdlib中的qsort快排达到nlogn的复杂度。
代码如下,依旧提醒超时。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */int cmp(const void *a, const void *b){ return *(int*)a - *(int*)b; //由小到大排序 //return *(int *)b - *(int *)a; 由大到小排序}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { struct ListNode*temp=*lists; int array[1000]; int size=0; //indicate the size of array for(int i=0;i<listsSize;i++) { struct ListNode*temp=*(lists+i); while(temp!=NULL){ array[size++]=temp->val; temp=temp->next; } } if(size==0) return 0; qsort(array,size,sizeof(int),cmp); struct ListNode* head=(struct ListNode*)malloc(size*sizeof(struct ListNode)); temp=head; int i=0; while(i<size){ temp->val=array[i]; if(i!=size-1) { temp->next=temp+1; temp=temp->next; } } temp->next=NULL; return head; }
第三次尝试:
=====================分割线==============
下次再写
阅读全文
0 0
- Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
- LeetCode[Linked List]: Merge k Sorted Lists
- Merge Two Sorted Lists and Merge k Sorted Lists
- Merge k sorted linked lists
- Merge k sorted linked lists
- Merge Sorted Lists and Merge Sorted Arrays
- 6.5-9 merge k sorted lists into one sorted list with O(n lg k)
- [LeetCode] Merge K Sorted Linked Lists
- Merge Sorted Array,Merge Two Sorted Lists,Remove ... Sorted List,Count and Say,Climbing Stairs
- 23. Merge k Sorted Lists(divide and conquer)
- 21. Merge Two Sorted Lists(Linked List)
- 【LeetCode】【Linked List】Merge Two Sorted Lists
- LeetCode Merge Two Sorted Lists and Sort List
- The two numbers and return it as a linked list
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K Sorted Lists
- 数组操作函数封装
- Centos6.5搭建vsftpd,并配置用户和密码登录
- Windows下配置多个版本的opencv
- OkHttp3.9源码解析(一)
- Spring Cloud之Spring EL(1)
- Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
- python中的JSON数据的转换
- Tensorflow一些常用基本概念与函数(1)
- 详述「设计模式」及其 Java 实现
- Java的四舍五入
- Android源代码目录结构分析及浅谈OS体系结构:
- List / Map / Collections方法
- xml标签
- 关于RFID简单操作说明