#23 Merge k Sorted Lists

Description

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example

input::[1->4->5, 1->3->4, 2->6]
output: 1->1->2->3->4->4->5->6

解题思路

承接 #21 的解题思路,通过k个指向各个list的指针,每次找到最小的那个数放在answer之后,全部走完返回answer就是最终结果了

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        int i;
        ListNode t = new ListNode(0);
        ListNode h = t;
        List<ListNode> ls = new ArrayList<>(Arrays.asList(lists));
        int ls_num = ls.size();
        for(i = 0; i < ls_num; i++)
            if(lists[i] != null)
                break;
        if(i == ls_num)
            return t.next;
        if(ls_num == 1 && lists[0] == null)
            return t.next;
        while(ls_num != 0){
            int small_pos = -1;
            int small_number = 99999;
            for(i = 0; i < ls.size(); i++){
                if(lists[i] == null)
                    continue;
                int val = lists[i].val;
                if(val < small_number){
                    small_pos = i;
                    small_number = val;
                }
            }
            if(small_pos == -1)
                break;
            t.next = new ListNode(small_number);
            t = t.next;
            lists[small_pos] = lists[small_pos].next;
            if(lists[small_pos] == null)
                ls_num --;
        }
        return h.next;
    }
}

但是需要考虑很多很多很多很多问题
这套代码我经历了8次RumTime Error……才有上面这份代码,而且自从我自己修改了input之后,我就记不住之前的input长什么样了,leetcoce就疯狂给我报unsupported operation exception 暴风哭泣
具体要考虑的有

  • [[[]]]
  • [[], []]
  • []
  • [[], [1]]

还有部分忘记了……反正就是各种边界值
结果跑下来还355ms
今天是悲伤皮儿

然后换了种之前一直想尝试的作弊解法hhhhh
把所有的list读进arraylist里面,然后用Collections.sort对arraylist进行排序,再重新构建一个新的listnode用于返回
时间居然比上面短!
还不是一点点
18ms……
好的我自闭了

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        int i;
        List<Integer> list = new ArrayList<>();
        ListNode answer = new ListNode(0);
        ListNode temp = answer;
        for(i = 0; i < lists.length; i++){
            ListNode t = lists[i];
            while(t != null){
                list.add(t.val);
                t = t.next;
            }
        }
        Collections.sort(list);
        for(i = 0; i < list.size(); i++){
            temp.next = new ListNode(list.get(i));
            temp = temp.next;
        }
        return answer.next;
    }
}

我究竟是为什么才要经历8次RunTime Error去处理边界啦!
QuQ

这次没有其它了

猜你喜欢

转载自blog.csdn.net/YY_Tina/article/details/86710358
今日推荐