剑指16.合并两个排序的链表

题目描述

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

思路

可以使用递归实现,也可以用非递归。

注意:需要考虑到很多很多特殊情况!!如边界条件;链表中的值有相同的情况;某一个链表中连续几个值都比另一个链表的当前值小(大)。

解法1(递归)思路:当得到两个链表中值较小的头节点并把它链接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此可以用递归完成这一过程。

 

解法2(非递归)思路:类似于归并排序中子序列的合并过程,不断比较两个链表的val值,然后判断哪个节点需要优先添加到合并链表尾部。

 

解法1(递归):

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)
            return list2;
        if(list2 == null)
            return list1;
        ListNode list = null;
        if(list1.val <= list2.val){
            list = list1;
            list.next = Merge(list1.next, list2);
        }else{
            list = list2;
            list.next = Merge(list1, list2.next);
        }
        return list;
    }
}

 

 解法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) {
        if(list1 == null)
            return list2;
        if(list2 == null)
            return list1;
        ListNode head = new ListNode(-1);//初始化合并链表的头节点
        ListNode cur = head; //该节点始终指向合并链表的尾部
        while(list1 != null && list2 != null){
            if(list1.val <= list2.val){
                cur.next = list1;
                list1 = list1.next;
            }else{
                cur.next = list2;
                list2 = list2.next;
            }
            cur = cur.next; //更新当前节点,使其始终指向合并链表的尾部
        }
        if(list1 != null)
            cur.next = list1;
        if(list2 != null)
            cur.next = list2;
        return head.next;
    }
}

 

 
posted @ 2020-08-09 23:04  不学无墅_NKer  阅读(149)  评论(0编辑  收藏  举报