import java.util.PriorityQueue;
public class ListMerge {
//输入两个单调递增的链表,输出两个链表合成后的链表,满足单调递增规则
//两种解法
//1.使用了额外的数据结构
public ListNode Merge(ListNode list1,ListNode list2) {
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
//新建一个有序队列
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
//遍历两个链表,将值压入队列
while (list1!=null){
priorityQueue.add(list1.val);
list1 = list1.next;
}
while (list2!=null){
priorityQueue.add(list2.val);
list2 = list2.next;
}
//新建一个链表,从队列中取出元素
ListNode res = new ListNode(priorityQueue.poll());
res.next = new ListNode(priorityQueue.poll());
ListNode l = res.next;
while (!priorityQueue.isEmpty()){
l.next = new ListNode(priorityQueue.poll());
l = l.next;
}
return res;
}
//2.未使用额外的数据结构
public ListNode MergeSecond(ListNode list1,ListNode list2) {
//判断是否为空
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
//建立目标链表
ListNode newListNode = new ListNode(0);
//建立三个新链表作为指针,遍历用
ListNode l1 = list1;
ListNode l2 = list2;
ListNode l3 = newListNode;
//当两个链表都不为空时,遍历l1,l2,比较l1,l2元素,将较小的节点写入l3
while (l1!=null&&l2!=null){
//如果l1写入了,就l1走下一个节点;如果l2写入了,就l2走下一个节点
if(l1.val<l2.val){
l3.next = l1;
l1 = l1.next;
}else {
l3.next = l2;
l2 = l2.next;
}
l3 = l3.next;
}
//如果一个链表空了,就将另一个链表全部写入l3
while (l1!=null){
l3.next = l1;
l1 = l1.next;
l3 = l3.next;
}
while (l2!=null){
l3.next = l2;
l2 = l2.next;
l3 = l3.next;
}
return newListNode.next;
}
}
合并两个排序的链表-----牛客笔记
最新推荐文章于 2024-10-03 13:36:06 发布