题目地址(21. 合并两个有序链表)

https://leetcode-cn.com/problems/merge-two-sorted-lists/

题目描述

  1. 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
  2. 示例 1
  3. 输入:l1 = [1,2,4], l2 = [1,3,4]
  4. 输出:[1,1,2,3,4,4]
  5. 示例 2
  6. 输入:l1 = [], l2 = []
  7. 输出:[]
  8. 示例 3
  9. 输入:l1 = [], l2 = [0]
  10. 输出:[0]
  11. 提示:
  12. 两个链表的节点数目范围是 [0, 50]
  13. -100 <= Node.val <= 100
  14. l1 l2 均按 非递减顺序 排列

前置知识


公司

  • 暂无

思路

整一条新的链表 然后双指针遍历之前两个链表 哪个小就添加哪个 最后剩余的不为空的链表就直接加到新链表的最后

关键点


代码

  • 语言支持:Java

Java Code:

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
  13. ListNode node = new ListNode(-1);
  14. ListNode res = node;
  15. ListNode head1 = list1;
  16. ListNode head2 = list2;
  17. while (head1 != null && head2 != null) {
  18. if (head1.val >= head2.val) {
  19. res.next = head2;
  20. res = res.next;
  21. head2 = head2.next;
  22. }else {
  23. res.next = head1;
  24. res = res.next;
  25. head1 = head1.next;
  26. }
  27. }
  28. if (head1 == null) {
  29. res.next = head2;
  30. }
  31. if (head2 == null) {
  32. res.next = head1;
  33. }
  34. return node.next;
  35. }
  36. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:21. 合并两个有序链表 - 图1#card=math&code=O%28n%29&id=QXm9K)
  • 空间复杂度:21. 合并两个有序链表 - 图2#card=math&code=O%28n%29&id=ovmNq)