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

合并k个已排序的链表

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
  	//返回两个有序链表合成的有序列表
    ListNode *sort(ListNode* list1,ListNode* list2){
        if(!list1)
            return list2;
        if(!list2)
            return list1;
        ListNode *newHead= new ListNode(0);
        ListNode* newTail, *tmp;
        newTail = newHead;
        while(list1 && list2){
            if(list1->val<list2->val){
                tmp = list1->next;
                list1->next = NULL;
                newTail->next = list1;
                newTail = list1;
                list1 = tmp;
            }
            else{
                tmp = list2->next;
                list2->next = NULL;
                newTail->next = list2;
                newTail = list2;
                list2 = tmp;
            }
        }
        if(list1)
            newTail->next = list1;
        if(list2)
            newTail->next = list2;
        return newHead->next;
    }
	
  	//递归代码实现归并排序,大问题逐步划分,直到小问题变成2个链表调用sort()合并 或 只有1个链表时返回
    ListNode *merge(vector<ListNode *> lists,int start,int end){
        if(start==end)
            return lists[start];
        if(end-start == 1)
            return sort(lists[start],lists[end]);
        int mid = start+(end-start)/2;
        ListNode* left = merge(lists,start,mid);
        ListNode* right = merge(lists,mid+1,end);
        return sort(left,right);    
    }
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        int start = 0;
        int end = lists.size()-1;
        if(end<start)  //lists长度为0,返回NULL
            return NULL;
        return merge(lists,start,end);
    }
};

全部评论

相关推荐

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