Java 合并两个排序的链表
使用迭代和借助额外数组解决剑指offer第JZ25题合并两个排序的链表的问题。
一、问题描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤ n≤1000,−1000≤节点值≤1000
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
示例:
输入:{-1,2,4},{1,3,4}
返回值:{-1,1,2,3,4,4}
二、迭代版本求解
操作:
●1.先判断list1和list2是不是为空,如果有一个为空,那另一个即为所求输出;
●2.初始化:定义head指向新链表的头结点,newList用于指向新节点。
●3.循环判断list1和list2节点值的大小,如果list1指向的结点值小于等于list2指向的结点值,则将list1指向的结点值链接到newList的next指针,然后list1指向下一个结点值,否则,让list2指向下一个结点值。
●4.循环对比步骤,直到list1或者list2为null,将list1或者list2剩下的部分链接到newList的后面。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1, ListNode list2) {
//判断是否有空链表
if (list2 == null) {
return list1;
}
if (list1 == null) {
return list2;
}
if(list1 == null && list2 == null){
return null;
}
//创建head指向新链表的头结点,newList用于指向新节点。
ListNode head = new ListNode(0);
ListNode newList= head;
// 循环判断list1和list2节点值的大小
while (list1 != null && list2 != null) {
switch (list1.val <= list2.val ? 1 : 2) { //三元运算符
case 1:
newList.next = list1; //list1.val <= list2.val,将list1指向的结点值链接到newList的next指针
list1 = list1.next; //list1指向下一个结点值
break;
case 2:
newList.next = list2; //list1.val > list2.val,将list2指向的结点值链接到newList的next指针
list2 = list2.next; //list2指向下一个结点值
break;
}
newList = newList.next; //添加一个链表元素后,newList指向下一个结点值,重新循环添加
}
// list1或者list2为null,将list1或者list2剩下的部分链接到newList的后面。
if(list1 == null){
newList.next = list2;
}
if(list2 == null){
newList.next = list1;
}
return head.next; //头结点head是空,head的下一个节点才是第一个有值的节点
}
}
三、借助额外数组
解题思路:
●1.创建额外存储数组 nums
●2.依次循环遍历 pHead1, pHead2,将链表中的元素存储到 nums中,再对nums进行排序
●3.依次对排序后的数组 nums取数并构建合并后的链表
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
// list1 或者list2为空的情况
if(list1==null) return list2;
if(list2==null) return list1;
if(list1 == null && list2 == null){
return null;
}
//将两个链表存放在list中
ArrayList<Integer> list = new ArrayList<>();
// 遍历存储list1
while(list1!=null){
list.add(list1.val);
list1 = list1.next;
}
// 遍历存储list2
while(list2!=null){
list.add(list2.val);
list2 = list2.next;
}
// 对 list 排序
Collections.sort(list);
// 将list转换为 链表
ListNode newHead = new ListNode(list.get(0));
ListNode cur = newHead;
for(int i=1;i<list.size();i++){
cur.next = new ListNode(list.get(i));
cur = cur.next;
}
// 输出合并链表
return newHead;
}
}
注意
Collections类中的sort方法可以实现对List接口的集合进行排序。这个方法假定列表元素实现了Comparable接口。可以根据指定比较器产生的顺序对指定列表进行排序。
sort(List<T> list, Comparator<? super T> c)
Collections.sort(list);实现升序排列
Collections.sort(list,Collections.reverseOrder());实现降序排列