合并两个排序的链表

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例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
/**
* 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) {
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%的用户

-------------本文结束 感谢您的阅读-------------

文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!