21 : 合并两个有序的链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(-1); // 定义虚拟头节点
ListNode cur = dummyHead; // 定义跟着移动的指针
while(l1!=null && l2 != null){ // 先看两个链表都不为空的时候
if(l1.val < l2.val){
cur.next = l1; // 把较小的加入到cur节点的后面,并且移动l1到下一个节点
l1 = l1.next;
}else{
cur.next = l2;
l2 =l2.next;
}
cur = cur.next; //在cur的后面加好了节点之后,要移动cur节点
}
if(l1 != null){ //如果l1还有剩余,则把l1接上去
cur.next = l1;
}
else{ //注意这里一定是else。如果写 if(l2!=null) 会报错! 超出时间限制!
cur.next = l2;
}
return dummyHead.next; //最后返回虚拟头节点的下一个节点
leetcode 23 合并 k 个排序链表,返回合并后的排序链表。
采用分治的思想
class Solution {
public ListNode mergeKLists(ListNode[] lists){
// 当 数组的长度等于0,1,2的时候:
if(lists.length == 0){
return null;
}
if(lists.length ==1){
return lists[0];
}
if(lists.length == 2){
return mergeTwoLists(lists[0],lists[1]);
}
// 定义两个数组,存放分开的子数组
// 第一个数组的长度是 lists.length/2 , 第二个长度是lists.length - lists.length/2
int mid = lists.length/2;
ListNode[] lists1 = new ListNode[mid];
ListNode[] lists2 = new ListNode[lists.length-mid];
for(int i = 0 ; i < mid ;i++){
lists1[i] = lists[i];
}
for(int i = 0 ; i < lists.length-mid ;i++){
lists2[i] = lists[i+mid];
}
ListNode lt1 = mergeKLists(lists1); // 递归,最后返回的是一个已经合并好的长链表
ListNode lt2 = mergeKLists(lists2);
return mergeTwoLists(lt1,lt2); // 再把最后两个合并好的 合并
}
// 合并两个链表的函数
public ListNode mergeTwoLists(ListNode l1, ListNode l2){
ListNode dummyHead = new ListNode(-1);
ListNode cur = dummyHead;
while(l1!=null && l2 != null){
if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}else{
cur.next = l2;
l2 =l2.next;
}
cur = cur.next;
}
if(l1 != null){
cur.next = l1;
}else{
cur.next = l2;
}
return dummyHead.next;
}