使用迭代和借助额外数组解决剑指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 list = new ArrayList<>();// 遍历存储list1while(list1!=null){list.add(list1.val);list1 = list1.next;}// 遍历存储list2while(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
注意
Collections类中的sort方法可以实现对List接口的集合进行排序。这个方法假定列表元素实现了Comparable接口。可以根据指定比较器产生的顺序对指定列表进行排序。
sort(List list, Comparator super T> c)
Collections.sort(list);实现升序排列
Collections.sort(list,Collections.reverseOrder());实现降序排列