目录
  1. 1. 迭代法
  2. 2. 递归法
合并有序链表

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

题设类

1
2
3
4
5
6
//Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

迭代法

这个在数据结构中学过,虽然那时候学的是 C语言,但是思想相同。
由于没有头节点,我们可以假设个头节点,更容易的返回合并后的链表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//设置头节点
ListNode head = new ListNode(-1);
ListNode p = head;

while(l1 != null && l2 != null){
if(l1.val < l2.val){
p.next = l1;
l1 = l1.next;
}else{
p.next = l2;
l2 = l2.next;
}

p = p.next;
}

//将两个链表中剩下的一个链表直接接在末尾
p.next = (l1 == null)?l2:l1;

return head.next;
}
  • 时间复杂度 O(n+m)
  • 空间复杂度 O(1)

递归法

我们可以递归的定义在两个链表的 merge 操作:

也就是说,头部比较小的一个与剩下元素的 merge 操作结果连接起来,就可以得到最终的链表

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
}
  • 时间复杂度 O(n+m)
  • 空间复杂度 O(n+m),由于需要n+m个栈帧
文章作者: EasonZzZz
文章链接: http://yoursite.com/2019/10/25/算法之旅/LeetCode/合并有序链表/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Nice To Meet U