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

2019-12-01  本文已影响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
/*
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;  //返回头结点  
    }
}

上一篇下一篇

猜你喜欢

热点阅读