《剑指offer》 链表第四题:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路:有两种方法,一种是非递归方法(双指针法),另一种是递归法。

class Listlcz4                     //非递归
{
    class Node{
        int val;
        Node next;
        Node(int val)
        {
            this.val=val;
        }
    }

    public Node join(Node list1,Node list2)
    {
        if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        if(list1==null&&list2==null)
            return null;
        Node head= new Node(-1);
        Node thehead=head;
        while(list1!=null&&list2!=null)
        {
            if(list1.val<=list2.val)
            {
                thehead.next=list1;
                list1=list1.next;
            }
            else {
                thehead.next=list2;
                list2=list2.next;
            }
            thehead=thehead.next;             //更新下一个节点
        }

          if(list1!=null)                             // 看看list1/list2有没有剩余元素,但是不会出现
              thehead.next=list1;                    // list1和list2都会剩下元素的情况
          if(list2!=null)
              thehead.next=list2;
          return head.next;

    }


    public static void main(String[] args) {
        Listlcz4 node = new Listlcz4();
        Node list1=node.new Node(11);
        list1.next=node.new Node(22);
        list1.next.next=node.new Node(55);

        Node list2=node.new Node(22);
        list2.next=node.new Node(77);
        list2.next.next=node.new Node(88);


        Node result= node.join(list1,list2);
        while(result!=null)
        {
            System.out.print(result.val+" ");
            result=result.next;
        }


    }

}

在非递归法中,注意要定义两个指针,一个head指针,一个thehead指针,thehead指针继承head指针,而不能动head指针,因为在循环的最后要返回head.next,表示链表的第一个节点,而thehead用于循环。

递归方法解决:

package 链表;

class ListNode1
{
    class Node
    {
        int val;
        Node next;
        Node(int val)
        {
            this.val=val;
        }
    }

    public Node join(Node list1,Node list2)
    {
        if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        if(list1==null&&list2==null)
            return null;

       if(list1.val<=list2.val)
       {
           list1.next=join(list1.next,list2);
           return list1;
       }
       else {
           list2.next=join(list1,list2.next);
           return list2;
       }  //在每一次递归调用中,都会返回一个节点作为当前层级的合并结果。最终的返回结果会一层层地向上返回,
          // 直到整个链表的头节点。所以需要在每次递归中返回合适的节点,以确保最终得到正确的合并结果。
    }

    public static void main(String[] args) {
        ListNode1 list=new ListNode1();

        Node list1=list.new Node(11);
        list1.next=list.new Node(22);
        list1.next.next=list.new Node(33);

        Node list2=list.new Node(3);
        list2.next=list.new Node(13);


        Node res=list.join(list1,list2);
        while(res!=null)
        {
            System.out.print(res.val+" ");
            res=res.next;
        }
    }
}

在递归法中返回的return list1和return list2表示单次的结果的返回值,确保链表最后能得到正确的结果。

运行结果:

你可能感兴趣的:(java,数据结构,链表)