写点什么

【LeetCode】合并两个排序的链表 Java 题解

用户头像
HQ数字卡
关注
发布于: 2 小时前

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。


示例1:
输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:
0 <= 链表长度 <= 1000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 这是一个链表题目,链表通过指针来连接元素,链表可以方便地删除、插入数据,时间复杂度都是 O(1)。

  • 根据题意可得,l1, l2 都是递增的排序链表,利用这个特性,思路可以简化,直接迭代下一个节点,都是递增的。

  • 在递归解法中,如果 l1 节点值比 l2 小,下一个节点应该是 l1,应该 return l1,在 return 之前,指定 l1 的下一个节点应该是 l1.next 和 l2 俩链表的合并后的头结点。同理可得 l1 节点值 大于 l2 的情况。

  • 在迭代解法中,定义了哨兵节点,这可以在最后让我们比较容易地返回合并后的链表。这个操作解决链表问题很常见,请多学习一下这种解法。

通过代码

  • 递归解法


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        if (l1 == null) {            return l2;        } else if (l2 == null) {            return l1;        } else if (l1.val < l2.val) {            l1.next = mergeTwoLists(l1.next, l2);            return l1;        } else {            l2.next = mergeTwoLists(l1, l2.next);            return l2;        }    }}
复制代码


  • 非递归解法


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        if (l1 == null) {            return l2;        }        if (l2 == null) {            return l1;        }                ListNode ans = new ListNode(-1);        ListNode current = ans;        while (l1 != null && l2 != null) {            if (l1.val <= l2.val) {                current.next = l1;                l1 = l1.next;            } else {                current.next = l2;                l2 = l2.next;            }            current = current.next;        }        if (l1 != null) {            current.next = l1;        }        if (l2 != null) {            current.next = l2;        }        return ans.next;    }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n), 空间复杂度是 O(n)

  • 坚持算法每日一题,加油!

发布于: 2 小时前阅读数: 2
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】合并两个排序的链表Java题解