解题思路:这道题目是将vector函数中所有链表给组合在一起然后输出,而且存在vector函数的单链表是已经排序了的。 这道题可以用分治递归的方法做,首先将vector函数的所有单链表两两组合在一起,然后添加在vector函数后面,若最后有一个单链表剩余那么直接跳过。然后将vector进行递归,直到单链表数量为1.
解题过程:给定一个vecto<ListNode *>&lists数组,判断lists长度是否为0,若是直接返回NULL,若是1,直接返回该链表;否则进入递归将数组中的链表按顺序两两组合,然后删除该两个链表,并且添加得到的新的链表。
代码实现:ListNode*mergeKLists(vector<ListNode *> &lists) {
int l=lists.size();\\这里将lists长度赋值给l的原因是:只判断当前未组合的链表,因为组合好的链表是直接加载lists后面的。
if(lists.size()==0) return NULL;
else if(lists.size()==1) returnlists[0];
else{
while(l>1)\\这里要判断l大于1,不判断大于0的原因是只剩一个单链表时,不进行组合
{
ListNode *root=new ListNode();
if(lists[0]!=NULL)
{
root->next=lists[0];
if(lists[1]!=NULL)
{
ListNode *r=root;
while(lists[1]!=NULL)
{
ListNode *p=newListNode();
p->val=lists[1]->val;
while(r->next!=NULL)
{
if(p->val<r->next->val)break;
else r=r->next;
}
p->next=r->next;
r->next=p;
lists[1]=lists[1]->next;
}
}
root=root->next;
}
else{
if(lists[1]!=NULL)root=lists[1];
}
ListNode *r=root;
vector<ListNode *>::iterator ite;
ite=lists.begin();
lists.erase(ite,ite+2);
l-=2;
lists.push_back(root);
}
return mergeKLists(lists);
}
}
个人总结:这道题稍微有点复杂,但是了解过程,直到思想以后也是很简单的,而且这道题方法也有很多种,也可以不用递归的。
注意事项:将两个单链表合并时,要注意链表的操作,避免失误。