携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天--如何合并两个链表

72 阅读2分钟

嗨,大家好,今天为大家带来一道题目, 看图

image.png

image.png 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!🎉🎉🎉