Loading

力扣 - 21. 合并两个有序链表

题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

思路1

循环实现,创建一个头结点,再创建一个排序指针指向头结点。指向较小的结点,再比较后两个结点的大小,把指针指向小的那一个结点,当前链表指针要后移一位,每次循环结束指向头结点的排序指针要后移一位

代码实现

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //头结点
        ListNode head = new ListNode(-1);
        //指针
        ListNode pre = head;
        //还没到达末尾时
        while (l1 != null && l2 != null) {
            //那个值小就讲指针的next指向它
            if (l1.val  <= l2.val) {
                pre.next = l1;
                //后移一位
                l1 = l1.next;
            } else {
                pre.next = l2;
                l2 = l2.next;
            }
            //循环末尾要讲指针指向下一个
            pre = pre.next;
        }
        //还会剩下一个结点还没正确排序,为空的说明已经排序了,不为空说明就是它还没排序了
        pre.next = l1 == null ? l2 : l1;
        //头结点不是我们要的答案,要返回头结点下一个,即第一个结点
        return head.next;
    }
}

思路2

利用递归,思路其实和1差不多,我们可以从最后一个推到第一个,也就慢慢地连成了一个我们需要的有序链表

代码实现

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //基线条件
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }
        //如果l1的值小的话,那么将l1的下一位和l2进行比较,得到的结果就是这个l1的next
        if (l1.val <= l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}
posted @ 2020-10-03 00:21  linzeliang  阅读(108)  评论(0)    收藏  举报