美文网首页
《剑指offer》(十六)-合并两个排序的链表(java)

《剑指offer》(十六)-合并两个排序的链表(java)

作者: 鼠小倩 | 来源:发表于2019-12-01 21:54 被阅读0次

    合并两个排序的链表

    考点:链表

    题目描述

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

    代码格式

    /*
    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }*/
    public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2) {
            
        }
    }
    
    image.png

    注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3.

    解题一-递归

    1.思路
    首先分析合并两个链表的过程。我们的分析从合并两个链表的头结点开始。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点。如下图所示。


    image.png
    • 链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点是合并后链表的头结点。
    • 在剩余的结点中,链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点是剩余结点的头结点,把这个结点和之前已经合并好的链表的尾结点链接起来。
      继续合并两个链表中剩余的结点(图中虚线框所示)。在两个链表中剩下的结点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。我们还是比较两个头结点的值。此时链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点的值将是合并剩余结点得到的链表的头结点。我们把这个结点和前面合并链表时得到的链表的尾结点(值为1的结点)链接起来,如图所示。
      2.代码
    /*
    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }*/
    public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2) {
            ListNode head;
                if (list1 == null) {
                    return list2;
                }
                if (list2 == null) {
                    return list1;
                }
                if(list1==null||list2==null){
                    return null;
                }
                if(list1.val<=list2.val){
                    head=list1;
                    head.next=Merge(list1.next,list2);
                }else{
                    head=list2;
                    head.next=Merge(list1,list2.next);
                }
                return head;
        }
    }
    

    解题二-非递归

    2.代码

    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {//构造方法
            this.val = val;
        }
    }*/
    public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2) {
            //新建一个头节点,用来存合并的链表。
            ListNode head=new ListNode(-1);//为什么这样子是新建一个头结点?
            //因为这样子是利用了构造方法创建一个链表
            //其实也可以ListNode list = null;
            head.next=null;
            ListNode root=head;
            if (list1 == null) {//还要判断是不是空链表,全部考虑玩所有的情况
                return list2;
            }
            if (list2 == null) {
                return list1;
            }
            while(list1!=null&&list2!=null){
                if(list1.val<list2.val){
                    head.next=list1;
                    head=list1;
                    list1=list1.next;
                }else{
                    head.next=list2;
                    head=list2;
                    list2=list2.next;
                }
            }
            //把未结束的链表连接到合并后的链表尾部
            if(list1!=null){
                head.next=list1;
            }
            if(list2!=null){
                head.next=list2;
            }
            return root.next;  //返回头结点  
        }
    }
    
    

    相关文章

      网友评论

          本文标题:《剑指offer》(十六)-合并两个排序的链表(java)

          本文链接:https://www.haomeiwen.com/subject/gtrfgctx.html