import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param lists ListNode类ArrayList 
     * @return ListNode类
     */
    public ListNode mergeKLists (ArrayList<ListNode> lists) {
        // write code here
        if(lists == null || lists.size() == 0) return null;
        List<Integer> intList = new ArrayList<>();
        List<ListNode> nodeList = new ArrayList<>();
        List<ListNode> leaveList = new ArrayList<>();
        for(int i=0; i<lists.size(); i++){//拆分保存节点数据
            ListNode target = lists.get(i);
            getData(target, nodeList, intList, leaveList);
        }
        if(nodeList.size() == 0) return null;

        intList.sort(Integer::compareTo);
        int startInt = intList.get(0);
        ListNode startNode = null;
        for(int i=0; i<nodeList.size(); i++){
            ListNode temp = nodeList.get(i);
            if(startInt == temp.val){
                leaveList.remove(temp);
                startNode = temp;
                startNode.next = null;
                break;
            }
        }

        ListNode loopNode = startNode;
        for(int i=1; i<intList.size(); i++){
            int tempInt = intList.get(i);
            for(int j=0; j<nodeList.size(); j++){
                ListNode temp = nodeList.get(j);
                if(tempInt == temp.val){
                    if(loopNode == temp) continue;
                    if(!leaveList.contains(temp)) continue;
                    leaveList.remove(temp);
                    temp.next = null;
                    loopNode.next = temp;
                    loopNode = temp;
                    break;
                }
            }
        }

        


        return startNode;
    }

    private void getData(ListNode target, List<ListNode> nodeList, List<Integer> intList, List<ListNode> leaveList){
        if(target == null) return;
        intList.add(target.val);
        nodeList.add(target);
        leaveList.add(target);
        ListNode temp = target;
        while(true){
            if(temp == null) break;
            ListNode next = temp.next;
            if(next == null) break;
            intList.add(next.val);
            nodeList.add(next);
            leaveList.add(next);
            temp = next;
        }
    }
}