首页 > 其他 > 详细

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

时间:2020-10-03 09:45:56      阅读:47      评论:0      收藏:0      [点我收藏+]

题目

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

示例:

输入: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;
        }
    }
}

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

原文:https://www.cnblogs.com/linzedian/p/13763192.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!