题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
import java.util.*;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
// 归并思想 + 基础两两链表相加操作
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
return divideMerge(lists,0,lists.size()-1);
}
// 归并思想
public ListNode divideMerge(ArrayList<ListNode> lists,int left,int right) {
// 首先判断是否可以归并
if(left > right){
return null;
}else if(left == right){
return lists.get(left);
}
// 分为左右两侧归并
int mid = (left + right) / 2;
// 返回值是最终链表,采用递归不断进行左右两两链表合并
return mergeTwo(divideMerge(lists,left,mid),divideMerge(lists,mid+1,right));
}
// 两两链表合并操作
public ListNode mergeTwo(ListNode list1,ListNode list2){
// 先判断是否有数据
if(list1 == null || list2 == null){
if(list1 == null){
return list2;
}else if(list2 == null){
return list1;
}
}
// 设置返回头
ListNode head = new ListNode(-1001);
// 设置i
ListNode i = head;
// 双方都有数据时进行比较大小并改变next
while(list1 != null && list2 != null){
if(list1.val > list2.val){
i.next = list2;
i = i.next;
list2 = list2.next;
}else{
i.next = list1;
i = i.next;
list1 = list1.next;
}
}
// 无数据时直接将另一方加入链表即可
if(list1 == null){
i.next = list2;
}else{
i.next = list1;
}
return head.next;
}
}
韶音科技公司氛围 643人发布