LeetCode——23. 合并K个排序链表

合并 k 个有序链表,返回合并后的有序链表。

输入:
[
1->3->7,
1->3->4,
2->6
]
输出: 1->1->2->3->3->4->6->7

这种问题可以利用指针思想通过递归调用最终转换成合并两个有序链表的问题

//链表节点
public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { 
    	val = x;
     }
}
 
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists == null) {
            return null;
        }
        return merge(lists, 0, lists.length - 1);
    }
    /**
    * 递归的方式最终转化成合并两个链表
    * 利用左右两个指针往中间靠拢最终合并成一个
    */
    private ListNode merge(ListNode[] lists, int left, int right) {
        if(left < right) {
            int middle = (left + right) / 2;
            ListNode leftList = merge(lists, left, middle);//递归
            ListNode rightList = merge(lists, middle + 1, right);//递归
            return mergeTwoLists(leftList, rightList);//合并两个链表
        } else if(left == right) {
            return lists[left];
        }
        //lists长度为0的情况
        return null;
    }
    //将两个有序链表合并成一个有序链表
    private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head= new ListNode(0);
        ListNode node = head;
        while(l1 != null && l2 != null) {
            if(l1.val > l2.val) {
                node.next = l2;
                node = l2;
                l2 = node.next;
            } else {
                node.next = l1;
                node = l1;
                l1 = node.next;
            }
        } 
        if(l1 != null) node.next = l1;
        if(l2 != null) node.next = l2;
        return head.next;
    }
}

你可能感兴趣的:(LeetCode——23. 合并K个排序链表)