嗨,大家好,今天为大家带来一道题目, 看图
1.采用递归的方式进行解答
先想一想怎么做
从头结点开始。比较list1和list2的头结点,哪个值更小,那个值小的链表的头结点接拼接好的链表,也就是说进入了递归
2.如果两个链表中有一个为空,返回非空链表,递归结束
3.在递归过程中,上一层较小的结点接上上个该节点的next和拎一个结点拼接好的表头就好
4.返回的是较小的结点,每一层都是
5.在递归的过程中,是怎样递归的呢,list1.val<=list2.val,将较小的list1.next与拼接好的merge后的表头连接,list.next=Merge(list1.next,list2),这就是一个递归过程
6.每一次返回时,返回排序好的表头结点,且是较小的结点
现在上代码
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2){
if(list1==null){
return list2;
}
else if(list2==null){
return list1;
}
if(list2.val>list1.val){
list1.next = Merge(list1.next,list2);
return list1;
}
else{
list2.next = Merge(list1,list2.next);
return list2;
}
}
}
方法二 运用双指针,归并排序,每次比较两个头部,从里面取出最小的元素,然后往后,这两个链表一直往后,需要两个指针方向同方向同访问
1:判断空链表的情况,只要有一个链表为空,那答案必定就是另一个链表了,就算另一个链表也为空。 2:新建一个空的表头后面连接两个链表排序后的节点,两个指针分别指向两链表头。 step 3:遍历两个链表都不为空的情况,取较小值添加在新的链表后面,每次只把被添加的链表的指针后移。
- step 4:遍历到最后肯定有一个链表还有剩余的节点,它们的值将大于前面所有的,直接连在新的链表后面即可。 public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
//特殊值处理,list1为空,返回链表2的头节点
if(list1 == null){
return list2;
}
//特殊值处理,list2为空,返回链表1的头节点
if(list2 == null){
return list1;
}
ListNode head = null;//合并后的链表头节点 //初始化头节点
if(list1.val <= list2.val){
head = list1;
list1 = list1.next;
}else{
head = list2; list2 = list2.next;
}
ListNode head0 = head;//初始化合并后的链表的尾节点 while(list1 !=null&& list2 != null){//当链表1和链表2都不为空时,比较两个链表的最小值`
if(list1.val <= list2.val){//链表1的最小值小于链表2的最小值
head0.next = list1; //合并后的链表的尾节点指向链表1的头节点
head0 = head0.next; //更新合并后的链表的尾节点 list1 = list1.next; //更新链表1的头节点`
}else{
head0.next = list2; //合并后的链表的尾节点指向链表2的头节点`
head0 = head0.next; //更新合并后的链表的尾节点`
list2 = list2.next; //更新链表2的头节点`
}
}
if(list1!=null){//当链表1不为空时,合并后的链表的尾节点指向链表1的头节点`
head0.next = list1;
}
if(list2!=null){//当链链表2不为空时,合并后的链表的尾节点指向链表2的头节点`
head0.next = list2;
}
return head;//返回合并后的链表的头节点`
}
}
今天的分享就到此结束,886!🎉🎉🎉