这种k个相同的子问题,可以两两分治,总的运算次数为logk
关键部分
int dis=1; int len=lists.size(); while(dis<=len) { for(int i=0;i<len-dis;i=i+dis*2){ lists[i]=solve(lists[i],lists[i+dis]); } dis*=2; } return lists[0];
(每次运算后剩下的子问题个数为 x/2 向上取整,这样每次/2,最后问题一定会解决)
注意判断空数组
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode* ret=NULL; if(lists.empty()) return ret; int dis=1; int len=lists.size(); while(dis<=len) { for(int i=0;i<len-dis;i=i+dis*2){ lists[i]=solve(lists[i],lists[i+dis]); } dis*=2; } return lists[0]; } ListNode* solve(ListNode* l1,ListNode*l2) { ListNode* tp=new ListNode(0); ListNode* head=tp; while(l1!=NULL&&l2!=NULL) { if(l1->val<=l2->val) { tp->next=l1; tp=tp->next; l1=l1->next; } else{ tp->next=l2; tp=tp->next; l2=l2->next; } } if (l1==NULL) tp->next=l2; else tp->next=l1; return head->next; } };