23. 合并K个升序链表(学习了java的自定义比较类)

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
这是目前唯一一题能想到的hard题了,没有用到什么特别高深的思想,就是一把梭!!!

自己的思路和代码:

1.把所有节点给排序了,然后再重新连起来

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists==null)
        {
            return null;
        }
        //放到个arraylist里面 然后就直接排序


        ListNode HeadFake=new ListNode(-9);
        // System.out.println(lists.length);

        // System.out.println(lists[0].val);
        // System.out.println(lists[1].val);
        // System.out.println(lists[2].val);

        List<ListNode> list_new = new ArrayList<ListNode>();
        for(int i=0;i<lists.length;i++)
        {
            while(lists[i]!=null)
            {
                // System.out.println(lists[i].val);
                list_new.add(lists[i]);
                lists[i]=lists[i].next;
            }
        }

        Collections.sort(list_new, new Comparator<ListNode>() {
            public int compare(ListNode a, ListNode b)
            {
                return (a.val-b.val);
            }
        });
        
        ListNode new_head=new ListNode(-1);
        ListNode NewHeadPtr=new_head;
        for (Iterator<ListNode> it = list_new.iterator(); it.hasNext(); ) {
            ListNode s = it.next();
            NewHeadPtr.next=s;
            NewHeadPtr=NewHeadPtr.next;
            // System.out.println(s.val);
        }

        // while(new_head.next!=null)
        // {
        //     // System.out.println(new_head.next.val);
        //     new_head=new_head.next;
        // }

        return new_head.next;



    }
}

Leecode和视频的题解思想

1.和我的一样,排序再重连

2.分治合并

class Solution {
public:
    ListNode* mergeTwoLists(ListNode *a, ListNode *b) {
        if ((!a) || (!b)) return a ? a : b;
        ListNode head, *tail = &head, *aPtr = a, *bPtr = b;
        while (aPtr && bPtr) {
            if (aPtr->val < bPtr->val) {
                tail->next = aPtr; aPtr = aPtr->next;
            } else {
                tail->next = bPtr; bPtr = bPtr->next;
            }
            tail = tail->next;
        }
        tail->next = (aPtr ? aPtr : bPtr);
        return head.next;
    }

    ListNode* merge(vector <ListNode*> &lists, int l, int r) {
        if (l == r) return lists[l];
        if (l > r) return nullptr;
        int mid = (l + r) >> 1;
        return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        return merge(lists, 0, lists.size() - 1);
    }
};

作者:LeetCode-Solution

视频的思路:

 其它:

还有就是发现java不用vector,所以,可以使用List的这个集合,所以有时间要看看java的set了。

原文地址:https://www.cnblogs.com/William-xh/p/13666437.html