给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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了。