问题描述
给定 k 个有序的链表,要求将其合并成一个有序的链表返回。题目链接:**点我**
样例输入输出
输入:[1->4->5, 1->3->4, 2->6]
输出:1->1->2->3->4->4->5->6
输入:[]
输出:[]
问题解法
利用归并排序的思路,将列表中两两分组,对每组中的两个链表,运用合并两个有序链表的做法将其合并成一个有序的链表,将这些合并后的链表继续两两分组,重复上述过程,直到最后只剩下一个链表,就是合并后的有序的链表。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
class Solution { private ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) { return l2; } if (l2 == null) { return l1; } ListNode p1 = l1; ListNode p2 = l2; if (p1.val > p2.val) { p1 = l2; p2 = l1; } ListNode head = p1; while (p2 != null) { while (p1.next != null && p1.next.val < p2.val) { p1 = p1.next; } ListNode temp = p1.next; p1.next = p2; p1 = p2; p2 = temp; } return head; } public ListNode mergeKLists(ListNode[] lists) { if (lists == null || lists.length == 0) { return null; } while (lists.length > 1) { ListNode[] temp = new ListNode[(lists.length + 1) / 2]; int index = 0; for (int i = 0; i < lists.length; ) { if (i + 1 < lists.length) { temp[index] = mergeTwoLists(lists[i], lists[i + 1]); i += 2; } else { temp[index] = lists[i]; i++; } index++; } lists = temp; } return lists[0]; } }
|