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

合并两个排序的链表

考点:链表

题目描述

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

代码格式

/*
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;  //返回头结点  
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容