letcode算法14--合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:暴力合并
/** * 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) { ListNode ans = null; for (int i = 0; i < lists.length; i++){ ans = twoLists(ans,lists[i]); } return ans; } public ListNode twoLists(ListNode a,ListNode b){ if (a == null|| b == null) return a != null? a:b; else { ListNode head = new ListNode(0); ListNode tail = head,aPtr = a,bPtr = b; while (aPtr != null && bPtr != null){ if(aPtr.val < bPtr.val){ tail.next = aPtr; aPtr = aPtr.next; }else { tail.next = bPtr; bPtr = bPtr.next; } tail = tail.next; } tail.next = (aPtr != null? aPtr:bPtr); return head.next; } } }
//Definition for singly-linked list. 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 static void main(String[] args) { ListNode l1 = new ListNode(1); ListNode l2 = new ListNode(4); ListNode l3 = new ListNode(5); l1.next = l2; l2.next = l3; ListNode l4= new ListNode(1); ListNode l5 = new ListNode(3); ListNode l6 = new ListNode(4); l4.next = l5; l5.next = l6; ListNode l7 = new ListNode(2); ListNode l8 = new ListNode(6); l7.next = l8; ListNode[] lists = new ListNode[3]; lists[0] = l1; lists[1] = l4; lists[2] = l7; ListNode cur = null; cur = mergeKLists(lists); while (cur != null){ System.out.print(cur.val); cur = cur.next; } } public static ListNode mergeKLists(ListNode[] lists) { ListNode ans = null; for (int i = 0; i < lists.length; i++){ ans = twoLists(ans,lists[i]); } return ans; } public static ListNode twoLists(ListNode a,ListNode b){ if (a == null|| b == null) return a != null? a:b; else { ListNode head = new ListNode(0); ListNode tail = head,aPtr = a,bPtr = b; while (aPtr != null && bPtr != null){ if(aPtr.val < bPtr.val){ tail.next = aPtr; aPtr = aPtr.next; }else { tail.next = bPtr; bPtr = bPtr.next; } tail = tail.next; } tail.next = (aPtr != null? aPtr:bPtr); return head.next; } }
方法二:分治法
将两端的链表合并,k ->k/2->k/4->....
class Solution { public static ListNode mergeKLists(ListNode[] lists) { return numtwoList(lists,0,lists.length -1); } public static ListNode numtwoList(ListNode[] lists, int l, int r){ if (l == r) return lists[l]; if (l > r) return null; // int mid = (l + r) /2;//也可以用>>1 int mid = (l + r)>>1; return twoLists(numtwoList(lists,l,mid),numtwoList(lists,mid + 1,r)); } public static ListNode twoLists(ListNode a,ListNode b){ if (a == null || b == null) return a != null ? a:b; else { ListNode head = new ListNode(0); ListNode tail = head,aPtr = a,bPtr = b; while (aPtr != null && bPtr != null){ if (aPtr.val < bPtr.val){ tail.next = aPtr; aPtr = aPtr.next; } else{ tail.next = bPtr; bPtr = bPtr.next; } tail = tail.next; } tail.next = (aPtr != null ? aPtr : bPtr); return head.next; } } }
方法三:

浙公网安备 33010602011771号