剑指offer之面试题17:合并两个排序的链表

题目描述

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

思路:养成好习惯,一旦有链表作为形参传递,都要对链表是否为空做判断,防止空指针异常,至于怎么处理,稍后会讲。当链表都不为空时,比较两个链表的头结点值的大小,较小者作为新的头结点保存,(不妨设较小的头结点来自list1)然后list1的下一个结点作为list1的一个新的头结点与list2的头结点比较,…,像是一个递归操作。递归出口:当一个链表为空时结束,然后此时直接返回不为空的链表的剩下的结点(这里对链表为空的处理做了说明,即当list1为空时,返回list2;反之,返回list1)。
牛客网OJ代码如下:

public class Solution {
    /*public static class ListNode{
        int val;
        ListNode next=null;
        ListNode(int val){
            this.val=val;
        }
    }*/
    public static ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null)
            return list2;
        else if(list2==null)
            return list1;
        ListNode pMergeHead=null;
        if(list1.val<list2.val){
            pMergeHead=list1;
            pMergeHead.next=Merge(list1.next,list2);
        }
        else{
            pMergeHead=list2;
            pMergeHead.next=Merge(list1,list2.next);
        }
        return pMergeHead;
    }
    /*public static void printLsit(ListNode head){
        ListNode pHead=head;
        //System.out.print(pHead.next.val+" ");
        while(pHead!=null){
            System.out.print(pHead.val+" ");
            pHead=pHead.next;
        }

    }
    public static void main(String[] args){
        List<ListNode> list=new ArrayList<ListNode>();
        List<ListNode> list2=new ArrayList<ListNode>();
        list.add(new ListNode(1));
        list.add(new ListNode(2));
        list.add(new ListNode(3));
        list.add(new ListNode(5));
        list.add(new ListNode(7));
        for(int i=0;i<list.size();i++){
            ListNode listNode=list.get(i);
            if(i+1<list.size()){
                listNode.next=list.get(i+1);
            }
        }
        list2.add(new ListNode(2));
        list2.add(new ListNode(4));
        list2.add(new ListNode(6));
        for(int i=0;i<list2.size();i++){
            ListNode listNode=list2.get(i);
            if(i+1<list2.size()){
                listNode.next=list2.get(i+1);
            }
        }
        printLsit(Merge(list.get(0),list2.get(0)));

    }*/
}

非递归做法,也要熟悉

public class Solution {
    public ListNode Merge(ListNode list1, ListNode list2) {
        if(list1 == null) return list2;
        if(list2 == null) return list1;

        ListNode mergeList = null;
        ListNode curNode = null;

        //初始化第一个节点
        if(list1.val < list2.val){
            curNode = list1;
            list1 = list1.next;
        }else{
            curNode = list2;
            list2 = list2.next;
        }
        mergeList=curNode;
        while(list1 != null && list2 != null){
            if(list1.val < list2.val){
                curNode.next = list1;
                curNode=list1;
                list1 = list1.next;
            }else{
                curNode.next = list2;
                curNode=list2;
                list2 = list2.next;
            }
        }
        if(list1!=null)curNode.next=list1;
        if(list2!=null)curNode.next=list2;

        return mergeList;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值