package com.tang.project1.utils;
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public class LeetCode23 {
static class Solution {
public static ListNode mergeKLists(ListNode[] lists){
//如果划分的lists总的链表个数为0
if (lists.length == 0) {
//返回空,示例2的那种情况,二位数组里面啥也没有,就只返回外面的空数组
return null;
}
//如果划分的lists总的链表个数为1
if (lists.length == 1) {
//返回空,示例3的那种情况,仅返回里面的空数组
return lists[0];
}
//如果划分的lists总的链表个数为2
if (lists.length == 2) {
//合并两个链表
return mergeTwoLists(lists[0],lists[1]);
}
//取中间点
int mid = lists.length/2;
//新建一个左边的数组
ListNode[] sub1 = new ListNode[mid];
for (int i = 0; i < mid; i++) {
//把从0到mid-1的数据赋到sub1
sub1[i] = lists[i];
}
//新建一个右边的数组
ListNode[] sub2 = new ListNode[lists.length - mid];
for (int i = mid; i < lists.length; i++) {
//从mid到lists.length-1的值赋给sub2
//sub也是一个新的数组,需要从0开始,所以sub2的下标是i-mid
sub2[i - mid] = lists[i];
}
//左边区域进行递归
ListNode l1 = mergeKLists(sub1);
//右边区域进行递归
ListNode l2 = mergeKLists(sub2);
//
return mergeTwoLists(l1,l2);
}
public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//虚拟节点的值是-1,其实它的值可以是任何的数,因为我们不需要用到虚拟节点的值
ListNode dummy = new ListNode(-1);//dummy辅助节点
ListNode pre = dummy;//设置一个指向辅助节点的指针
while(list1 != null && list2 != null){//虽然list1和list2有可能长度不一样
if(list1.val < list2.val){//如果list1的指针指向的值小于list2
pre.next = list1;//pre就指向list1
list1 = list1.next;//list1自己的指针往后移动
}else{//如果list2的指针指向的值小于等于list1
pre.next = list2;//pre就指向list2
list2 = list2.next;//list2自己的指针往后移动
}
pre = pre.next;//pre也要向后移动
}
if(list1 != null){//有可能list2遍历完了,list1还没有遍历完
pre.next = list1;//直接把list1剩下的部分拼接到已经拼好的链表后面
}
if(list2 != null){//有可能list1遍历完了,list2还没有遍历完
pre.next = list2;//直接把list2剩下的部分拼接到已经拼好的链表后面
}
return dummy.next;//返回虚拟节点的next指针
}
}
public static void main(String[] args) {
ListNode a = new ListNode(1);
ListNode b = new ListNode(4);
ListNode c = new ListNode(5);
a.next = b;
b.next = c;
ListNode m = new ListNode(1);
ListNode n = new ListNode(3);
ListNode p = new ListNode(4);
m.next = n;
n.next = p;
ListNode s = new ListNode(2);
ListNode t = new ListNode(6);
s.next = t;
ListNode[] lists = {a,m,s};
ListNode listNode = Solution.mergeKLists(lists);
while (listNode != null){
System.out.print(listNode.val + "-->");
listNode = listNode.next;
}
}
}
合并K个升序链表(LeetCode23) ---链表和递归(Java)
于 2022-03-04 23:35:46 首次发布