题解 | #牛群的合并#
牛群的合并
https://www.nowcoder.com/practice/d0cb24e1494e4f45a4b7d1a17db0daef
考察知识点:数组,指针,遍历,链表
解题分析: 这题是需要组成一个新的链表,按升序排列,难点在于怎么从移植的链表数组中拿到一个最小值的,这里我选择遍历链表数组,每次都中数组中获取一个最小的成员出来,并添加到新的链表中;这样就能保证生成的最新链表都是从最小的值开始的
编程语言:C
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类一维数组
* @param listsLen int lists数组长度
* @return ListNode类
*/
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
struct ListNode *new_head = NULL, *tmp_head = NULL;
struct ListNode *min_head = NULL;
int index = 0;
while (1) {
min_head = NULL;
index = 0;
/* 每次都从链表数组这种取出一个最小的值 */
for (int i = 0; i < listsLen; i++) {
if (lists[i] == NULL)
continue;
if (min_head == NULL) { // 如果最小成员没有初始化,就将第一个值初始化给他
min_head = lists[i];
index = i; // 标记当前的值是从哪个链表中获取的
} else {
if (lists[i]->val < min_head->val) { // 如果找到了比当前的最小值更小的值,就更新最小值的地址以及对于的链表id
min_head = lists[i];
index = i;
}
}
}
if (min_head == NULL) // 如果获取到的最小的值是空,就表明所有的链表都遍历到了最后一个成员
break;
if (tmp_head == NULL) { // 如果新的链表没有初始化,就初始化新的链表
tmp_head = lists[index];
new_head = tmp_head; // 标记新链表的链表头
} else { // 新链表已经初始化的话,就将获取到的最小的成员添加到新链表中
tmp_head->next = lists[index];
tmp_head = tmp_head->next;
}
lists[index] = lists[index]->next; // 更新获取出成员的链表的指针为下一个成员
}
if (tmp_head) // 如果有初始化链表,就给新链表的最后一个成员的下有一个成员赋值为空,防止死循环
tmp_head->next = NULL;
return new_head;
}
面试高频TOP202解析 文章被收录于专栏
采用Java,C,Python等方法去解答面试高频TOP202题目,
