题解 | #合并k个已排序的链表#

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

/**
分享一个投机取巧的方法
观察题目可以看到取值为-1000~1000一共才2001个值,而list数量高达10^5,因此在暴力找最小之后,扫一遍所有链表头,把值相同的全连进返回值里面去,可以刚好卡进及格线
 */
class Solution {
public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        ListNode *ret=NULL;
        ListNode *retHead=NULL;
        //int finishListNum=lists.size();
        while(1)
        {
            int tmpMinIndex=-1;
            //find min node
            for(int i=0;i<lists.size();i++)
            {
                if(lists[i]==NULL)
                    continue;
                if(tmpMinIndex==-1)//初始化
                {
                    tmpMinIndex=i;
                    continue;
                }
                if(lists[i]->val<lists[tmpMinIndex]->val)
                {
                    tmpMinIndex=i;
                }
            }
            if(tmpMinIndex==-1)
                break;
            int tmpCurrVal=lists[tmpMinIndex]->val;
            //link
            if(ret==NULL)
                retHead=ret=lists[tmpMinIndex];
            else
            {
                ret->next=lists[tmpMinIndex];
                ret=ret->next;
            }
            lists[tmpMinIndex]=lists[tmpMinIndex]->next;
            //因节点取值很少,加速一下
            for(int i=0;i<lists.size();i++)
            {
                if(lists[i]==NULL)
                    continue;
                if(lists[i]->val==tmpCurrVal)
                {
                    ret->next=lists[i];
                    ret=ret->next;
                    lists[i]=lists[i]->next;
                }
            }
        }
        return retHead;
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务