题解 | #合并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) {}
* };
*/
// 先完成一个函数,作用是可以将两个升序链表合并成一个升序链表
ListNode* merge(ListNode* x, ListNode* y) {
ListNode* node = new ListNode(0);
ListNode* list = node;
if (x == nullptr || y == nullptr) {
if (x == nullptr && y == nullptr) {
return nullptr;
}
if (x == nullptr) {
return y;
}
if (y == nullptr) {
return x;
}
}
while (x != nullptr || y != nullptr) {
//这里不用对x和y都为nullptr进行判断的原因是总有一方先结束,一起为nullptr不可能
if (x == nullptr) {
list->next=y;
return node->next;
}
if (y == nullptr) {
list->next=x;
return node->next;
}
// 测试函数是否work的时候发现了这个问题,程序运行到这里总是发生段错误
// 在if里不能光是写判断大小x->val < y->val,因为有可能x或者y经过上面操作后已经有一方是nullptr,然后判断又指向val,那肯定会报错啊!
// 所以在进行判断时要加上判断它们是否为nullptr的条件,还有一点就是我这里的连接符是&&,只要x或者y为nullptr,即使x->val 或者y->val 是错误的,也不会报错!
if (x!=nullptr && y!=nullptr&&(x->val < y->val)) {
ListNode* pnextx = x->next;
list->next = x;
x->next = nullptr;
list = list->next;
x = pnextx;
}
// x!=nullptr && y!=nullptr&&(x->val >= y->val) 正确的
// (x->val >= y->val)&&x!=nullptr && y!=nullptr 错误的
// 我人嘛了,没想到if中如果有&&的话,是从左往右执行的,如果左项为false,右项即使有语法错误也不会执行
// 不过还好当时我故意调整了一下左项与右项的位置,学到了新知识,虽然找bug找了很久(得谢谢自己!)
if (x!=nullptr && y!=nullptr&&(x->val >= y->val)) {
ListNode* pnexty = y->next;
list->next = y;
y->next = nullptr;
list = list->next;
y = pnexty;
}
}
return node->next;
}
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
// test function weather works or not!!!
// ListNode* test=merge(lists[0], lists[1]);
// while (test!=nullptr) {
// cout << test->val << '\t' << endl;
// test=test->next;
// }
// return test;
if (lists.size()==0) {
return nullptr;
}
int count=lists.size();
while (count!=1) {
lists[lists.size()-2]=merge(lists[lists.size()-1], lists[lists.size()-2]);
lists.pop_back();
count=lists.size();
}
return lists[0];
}
};
迅雷公司福利 193人发布