[leetCode].合并两个有序列表

在这里插入图片描述

解法一 暴力解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //处理链表问题可以使用哑节点(哨兵节点)
        ListNode prehead = new ListNode(-1);
        //用一个指针指向这个哑节点
        ListNode prev = prehead;
        //循环条件为l1!=null,l2!=null
        while(l1 != null && l2 != null){
            //比较l1,l2当前节点的大小
            if(l1.val <= l2.val){
                //将l1加到哑节点的链表上
                prev.next = l1;
                //l1指向l1链表上的下一个节点
                l1 = l1.next;
            }else{
                //将l2加到哑节点的链表上
                prev.next = l2;
                //l2指向l2链表上的下一个节点
                l2 = l2.next;   
            }
            //无论l1与l2的值谁大,prev指针都要移动到哑节点链表的最后一个节点
            prev = prev.next;
        }
        //循环结束后l1与l2一定有一个为非空,将非空链表拼接到哑节点所在链表的链表尾
        prev.next = l1 == null ? l2 : l1;
        return prehead.next;
    }
}

解法二 递归

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //l1.l2存在空链表,则返回非空链表
        if(l1 == null){
            return l2;
        }else if(l2 == null){
            return l1;
        }else if(l1.val <= l2.val){ //如果l1,l2都非空,则比较头节点,将较小的头节点指向子问题返回的链表
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }else{
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}
posted @ 2020-06-19 12:49  消灭猕猴桃  阅读(87)  评论(0编辑  收藏  举报