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;
       }
    }
}

方法三:

posted @ 2022-09-19 23:24  兴儿  阅读(20)  评论(0)    收藏  举报