合并两个升序链表

第十五题:合并两个排序的链表

 

题目描述

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

 

解析:

           node   1 -> 3 -> 5 -> 7 -> 9    

           node   2 -> 4 -> 6 -> 8 -> 10 

           result  1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10

 

过程:

           ①创建新的链表头pre,用于存储result链表

           ②两个链表同时遍历,按照下图所示进行连接链表

           ③返回pre链表头,此时pre就是合并好的新链表

 

注意:

           ①代码的鲁棒性(极限条件的考虑)

           ②进行链表连接的同时,并且要移动链表指针

           ③最后总有一个链表要先遍历完,此时将另一个链表追加到pre

 

具体实现如下图所示:

合并两个升序链表_第1张图片

 

具体实现代码如下:

 

//递归版本
public ListNode Merge(ListNode list1,ListNode list2) {
        //base条件,当两个链表其中有一个遍历结束
       if(list1 == null){
           return list2;
       }
       if(list2 == null){
           return list1;
       }
       //判断条件
       if(list1.val <= list2.val){
           //说明list1的链表头结点的值小,那么合并后的新链表的头结点为list1
           //做连接操作
           list1.next = Merge(list1.next, list2);
           return list1;
       }else{
           //说明list2的链表头结点的值小,那么合并后的新链表的头结点为list2
           //做连接操作
           list2.next = Merge(list1, list2.next);
           return list2;
       }       
}

//非递归版本
public ListNode Merge(ListNode list1,ListNode list2) {
        //代码的鲁棒性
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        ListNode head = null;  //头结点
        ListNode cur = null;  //连接节点
        //遍历两个链表
        while(list1 != null && list2 != null){
            if(list1.val <= list2.val){
                if(head == null){
                    //第一次连接新链表
                    head = cur = list1;
                }else{
                    //连接新链表
                    cur.next = list1;
                    //移动连接指针
                    cur = cur.next;
                }
                list1 = list1.next;
            }else{
                if(head == null){
                    //第一次连接新链表
                    head = cur = list2;
                }else{
                    //连接新链表
                    cur.next = list2;
                    //移动连接指针
                    cur = cur.next;
                }
                list2 = list2.next;
            }
        }
        //两个链表其中有一个遍历结束
        if(list1 == null){
            cur.next = list2;
        }
        if(list2 == null){
            cur.next = list1;
        }
        //返回新链表头
        return head;
    }

 

NowCoder(Online Coding, Please Click)

你可能感兴趣的:(剑指offer)