思路,用到分治法 Divide and Conquer Approach。简单来说就是不停的对半划分,比如k个链表先划分为合并两个k/2个链表的任务,再不停的往下划分,直到划分成只有一个或两个链表的任务,开始合并。举个例子来说比如合并6个链表,那么按照分治法,我们首先分别合并1和4,2和5,3和6。这样下一次只需合并3个链表,我们再合并1和3,最后和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) { if(lists.size()<=0) return NULL; return mergeRecursive(lists,0,lists.size()-1); } ListNode* mergeRecursive(vector<ListNode*>& lists,int leftSize,int rightSize) //迭代两两或者单个合并 { if(rightSize-leftSize==1) return mergeTwoLists(lists[leftSize],lists[rightSize]); if(rightSize==leftSize) return lists[leftSize]; return mergeTwoLists(mergeRecursive(lists,leftSize,leftSize+((rightSize-leftSize+1)>>1)-1), mergeRecursive(lists,leftSize+((rightSize-leftSize+1)>>1),rightSize)); } ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) //两两合并函数 { if(l1==NULL || l2==NULL) return (l1==NULL)?l2:l1; ListNode* p1=l1; ListNode* p2=l2; ListNode* lnHead=NULL; if(p1->val>p2->val) { lnHead=p2; p2=p2->next; } else { lnHead=p1; p1=p1->next; } lnHead->next==NULL; ListNode* newNode=lnHead; while(p1!=NULL && p2!=NULL) { if(p1->val>p2->val) { newNode->next=p2; p2=p2->next; newNode=newNode->next; newNode->next=NULL; } else { newNode->next=p1; p1=p1->next; newNode=newNode->next; newNode->next=NULL; } } if(p1==NULL) newNode->next=p2; if(p2==NULL) newNode->next=p1; return lnHead; } };ac为99.24%(最高,不太稳定,可能和oj的运行状态有关)