LeetCode:23. Merge k Sorted Lists(K個連結串列進行排序)
阿新 • • 發佈:2018-12-21
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
方法1:(利用類似的二路歸併排序,遞迴的方式)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ // 利用二路歸併排序的思想 class Solution { public ListNode mergeKLists(ListNode[] lists) { if(lists == null || lists.length < 1) { return null; } return helper(lists, 0, lists.length-1); } // 終止條件是l和r相等,最主要就是這個迴圈控制語句 private ListNode helper(ListNode[] lists, int l, int r) { if(l == r) { return lists[l]; } int mid = (l + r) / 2; return merge(helper(lists, l, mid), helper(lists, mid+1, r)); } // 通過指標合併兩個連結串列 private ListNode merge(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); ListNode tail = dummy; while(l1 != null && l2 != null) { if(l1.val < l2.val) { tail.next = l1; // tail.next=new ListNode(l1.val); l1 = l1.next; } else { tail.next = l2; // tail.next=new ListNode(l2.val); l2 = l2.next; } tail = tail.next; } // 如果l1不為空的話插入到tail後面 if(l1 != null) { tail.next = l1; } // 如果l2不為空的話插入tail的後面 if(l2 != null) { tail.next = l2; } return dummy.next; } }
時間複雜度:O(logn.n)
空間複雜度:O(n)