题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
1 2
| 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
|
限制:
0 <= 链表长度 <= 1000
题目链接
Leetcode
题目解答
解法一
迭代,初始化一个伪头节点prev
,和当前节点curr
,每次比较两个链表当前值的大小,将curr
节点的下一个节点指向两个链表中值较小的节点,再把当前节点和较小值节点向后移动一位。当其中一个链表到达表尾的时侯,如果另一个链表还有剩余节点,则直接把当前节点的下一个节点指向剩余的节点的第一个节点。
时间复杂度:$O(m + n)$ 空间复杂度:$O(1)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode prev = new ListNode(-1), curr = prev; while (l1 != null && l2 != null) { if (l1.val < l2.val) { curr.next = l1; l1 = l1.next; } else { curr.next = l2; l2 = l2.next; } curr = curr.next; } curr.next = l1 == null ? l2 : l1; return prev.next; } }
|
执行用时:1 ms, 在所有 Java 提交中击败了99.66%的用户
内存消耗:38 MB, 在所有 Java 提交中击败了99.86%的用户
解法二
递归,有一个链表节点是空节点就返回另一个链表节点,比较两个链表的节点值,把值较小节点的下一个节点指向下一层递归返回的节点,然后返回值较小的节点,递归结束就能得到合并之后的链表。
时间复杂度:$O(m + n)$ 空间复杂度:$O(m + n)$
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } }
|
执行用时:1 ms, 在所有 Java 提交中击败了99.66%的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了48.44%的用户
-------------本文结束 感谢您的阅读-------------
文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!