返回介绍

solution / 0000-0099 / 0021.Merge Two Sorted Lists / README

发布于 2024-06-17 01:04:40 字数 14290 浏览 0 评论 0 收藏 0

21. 合并两个有序链表

English Version

题目描述

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

 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

 

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

解法

方法一:递归

我们先判断链表 $l_1$ 和 $l_2$ 是否为空,若其中一个为空,则返回另一个链表。否则,我们比较 $l_1$ 和 $l_2$ 的头节点:

  • 若 $l_1$ 的头节点的值小于等于 $l_2$ 的头节点的值,则递归调用函数 $mergeTwoLists(l_1.next, l_2)$,并将 $l_1$ 的头节点与返回的链表头节点相连,返回 $l_1$ 的头节点。
  • 否则,递归调用函数 $mergeTwoLists(l_1, l_2.next)$,并将 $l_2$ 的头节点与返回的链表头节点相连,返回 $l_2$ 的头节点。

时间复杂度 $O(m + n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为两个链表的长度。

# Definition for singly-linked list.
# class ListNode:
#   def __init__(self, val=0, next=None):
#     self.val = val
#     self.next = next
class Solution:
  def mergeTwoLists(
    self, list1: Optional[ListNode], list2: Optional[ListNode]
  ) -> Optional[ListNode]:
    if list1 is None or list2 is None:
      return list1 or list2
    if list1.val <= list2.val:
      list1.next = self.mergeTwoLists(list1.next, list2)
      return list1
    else:
      list2.next = self.mergeTwoLists(list1, list2.next)
      return list2
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *   int val;
 *   ListNode next;
 *   ListNode() {}
 *   ListNode(int val) { this.val = val; }
 *   ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
  public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    if (list1 == null) {
      return list2;
    }
    if (list2 == null) {
      return list1;
    }
    if (list1.val <= list2.val) {
      list1.next = mergeTwoLists(list1.next, list2);
      return list1;
    } else {
      list2.next = mergeTwoLists(list1, list2.next);
      return list2;
    }
  }
}
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *   int val;
 *   ListNode *next;
 *   ListNode() : val(0), next(nullptr) {}
 *   ListNode(int x) : val(x), next(nullptr) {}
 *   ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
  ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
    if (!list1) return list2;
    if (!list2) return list1;
    if (list1->val <= list2->val) {
      list1->next = mergeTwoLists(list1->next, list2);
      return list1;
    } else {
      list2->next = mergeTwoLists(list1, list2->next);
      return list2;
    }
  }
};
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *   Val int
 *   Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
  if list1 == nil {
    return list2
  }
  if list2 == nil {
    return list1
  }
  if list1.Val <= list2.Val {
    list1.Next = mergeTwoLists(list1.Next, list2)
    return list1
  } else {
    list2.Next = mergeTwoLists(list1, list2.Next)
    return list2
  }
}
/**
 * Definition for singly-linked list.
 * class ListNode {
 *   val: number
 *   next: ListNode | null
 *   constructor(val?: number, next?: ListNode | null) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 *   }
 * }
 */

function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
  if (list1 == null || list2 == null) {
    return list1 || list2;
  }
  if (list1.val < list2.val) {
    list1.next = mergeTwoLists(list1.next, list2);
    return list1;
  } else {
    list2.next = mergeTwoLists(list1, list2.next);
    return list2;
  }
}
// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
//   pub val: i32,
//   pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
//   #[inline]
//   fn new(val: i32) -> Self {
//   ListNode {
//     next: None,
//     val
//   }
//   }
// }
impl Solution {
  pub fn merge_two_lists(
    list1: Option<Box<ListNode>>,
    list2: Option<Box<ListNode>>
  ) -> Option<Box<ListNode>> {
    match (list1, list2) {
      (None, None) => None,
      (Some(list), None) => Some(list),
      (None, Some(list)) => Some(list),
      (Some(mut list1), Some(mut list2)) => {
        if list1.val < list2.val {
          list1.next = Self::merge_two_lists(list1.next, Some(list2));
          Some(list1)
        } else {
          list2.next = Self::merge_two_lists(Some(list1), list2.next);
          Some(list2)
        }
      }
    }
  }
}
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *   this.val = (val===undefined ? 0 : val)
 *   this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function (list1, list2) {
  if (!list1 || !list2) {
    return list1 || list2;
  }
  if (list1.val <= list2.val) {
    list1.next = mergeTwoLists(list1.next, list2);
    return list1;
  } else {
    list2.next = mergeTwoLists(list1, list2.next);
    return list2;
  }
};
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *   public int val;
 *   public ListNode next;
 *   public ListNode(int val=0, ListNode next=null) {
 *     this.val = val;
 *     this.next = next;
 *   }
 * }
 */
public class Solution {
  public ListNode MergeTwoLists(ListNode list1, ListNode list2) {
    ListNode dummy = new ListNode();
    ListNode cur = dummy;
    while (list1 != null && list2 != null)
    {
      if (list1.val <= list2.val)
      {
        cur.next = list1;
        list1 = list1.next;
      }
      else
      {
        cur.next = list2;
        list2 = list2.next;
      }
      cur = cur.next;
    }
    cur.next = list1 == null ? list2 : list1;
    return dummy.next;
  }
}
# Definition for singly-linked list.
# class ListNode
#   attr_accessor :val, :next
#   def initialize(val = 0, _next = nil)
#     @val = val
#     @next = _next
#   end
# end
# @param {ListNode} list1
# @param {ListNode} list2
# @return {ListNode}
def merge_two_lists(list1, list2)
  dummy = ListNode.new()
  cur = dummy
  while list1 && list2
    if list1.val <= list2.val
      cur.next = list1
      list1 = list1.next
    else
      cur.next = list2
      list2 = list2.next
    end
    cur = cur.next
  end
  cur.next = list1 || list2
  dummy.next
end

方法二:迭代

我们也可以用迭代的方式来实现两个排序链表的合并。

我们先定义一个虚拟头节点 $dummy$,然后循环遍历两个链表,比较两个链表的头节点,将较小的节点添加到 $dummy$ 的末尾,直到其中一个链表为空,然后将另一个链表的剩余部分添加到 $dummy$ 的末尾。

最后返回 $dummy.next$ 即可。

时间复杂度 $O(m + n)$,其中 $m$ 和 $n$ 分别为两个链表的长度。忽略答案链表的空间消耗,空间复杂度 $O(1)$。

# Definition for singly-linked list.
# class ListNode:
#   def __init__(self, val=0, next=None):
#     self.val = val
#     self.next = next
class Solution:
  def mergeTwoLists(
    self, list1: Optional[ListNode], list2: Optional[ListNode]
  ) -> Optional[ListNode]:
    dummy = ListNode()
    curr = dummy
    while list1 and list2:
      if list1.val <= list2.val:
        curr.next = list1
        list1 = list1.next
      else:
        curr.next = list2
        list2 = list2.next
      curr = curr.next
    curr.next = list1 or list2
    return dummy.next
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *   int val;
 *   ListNode next;
 *   ListNode() {}
 *   ListNode(int val) { this.val = val; }
 *   ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
  public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    ListNode dummy = new ListNode();
    ListNode curr = dummy;
    while (list1 != null && list2 != null) {
      if (list1.val <= list2.val) {
        curr.next = list1;
        list1 = list1.next;
      } else {
        curr.next = list2;
        list2 = list2.next;
      }
      curr = curr.next;
    }
    curr.next = list1 == null ? list2 : list1;
    return dummy.next;
  }
}
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *   int val;
 *   ListNode *next;
 *   ListNode() : val(0), next(nullptr) {}
 *   ListNode(int x) : val(x), next(nullptr) {}
 *   ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
  ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
    ListNode* dummy = new ListNode();
    ListNode* curr = dummy;
    while (list1 && list2) {
      if (list1->val <= list2->val) {
        curr->next = list1;
        list1 = list1->next;
      } else {
        curr->next = list2;
        list2 = list2->next;
      }
      curr = curr->next;
    }
    curr->next = list1 ? list1 : list2;
    return dummy->next;
  }
};
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *   Val int
 *   Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
  dummy := &ListNode{}
  curr := dummy
  for list1 != nil && list2 != nil {
    if list1.Val <= list2.Val {
      curr.Next = list1
      list1 = list1.Next
    } else {
      curr.Next = list2
      list2 = list2.Next
    }
    curr = curr.Next
  }
  if list1 != nil {
    curr.Next = list1
  } else {
    curr.Next = list2
  }
  return dummy.Next
}
/**
 * Definition for singly-linked list.
 * class ListNode {
 *   val: number
 *   next: ListNode | null
 *   constructor(val?: number, next?: ListNode | null) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 *   }
 * }
 */

function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
  const dummy = new ListNode(0);
  let cur = dummy;
  while (list1 != null && list2 != null) {
    if (list1.val < list2.val) {
      cur.next = list1;
      list1 = list1.next;
    } else {
      cur.next = list2;
      list2 = list2.next;
    }
    cur = cur.next;
  }
  cur.next = list1 || list2;
  return dummy.next;
}
// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
//   pub val: i32,
//   pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
//   #[inline]
//   fn new(val: i32) -> Self {
//   ListNode {
//     next: None,
//     val
//   }
//   }
// }
impl Solution {
  pub fn merge_two_lists(
    mut list1: Option<Box<ListNode>>,
    mut list2: Option<Box<ListNode>>
  ) -> Option<Box<ListNode>> {
    let mut new_list = ListNode::new(0);
    let mut cur = &mut new_list;
    while list1.is_some() && list2.is_some() {
      let (l1, l2) = (list1.as_deref_mut().unwrap(), list2.as_deref_mut().unwrap());
      if l1.val < l2.val {
        let next = l1.next.take();
        cur.next = list1.take();
        list1 = next;
      } else {
        let next = l2.next.take();
        cur.next = list2.take();
        list2 = next;
      }
      cur = cur.next.as_deref_mut().unwrap();
    }
    cur.next = list1.or(list2);
    new_list.next
  }
}
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *   this.val = (val===undefined ? 0 : val)
 *   this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function (list1, list2) {
  const dummy = new ListNode();
  let curr = dummy;
  while (list1 && list2) {
    if (list1.val <= list2.val) {
      curr.next = list1;
      list1 = list1.next;
    } else {
      curr.next = list2;
      list2 = list2.next;
    }
    curr = curr.next;
  }
  curr.next = list1 || list2;
  return dummy.next;
};
# Definition for singly-linked list.
# class ListNode {
#   public $val;
#   public $next;
#   public function __construct($val = 0, $next = null)
#   {
#     $this->val = $val;
#     $this->next = $next;
#   }
# }

class Solution {
  /**
   * @param ListNode $list1
   * @param ListNode $list2
   * @return ListNode
   */

  function mergeTwoLists($list1, $list2) {
    $dummy = new ListNode(0);
    $current = $dummy;

    while ($list1 != null && $list2 != null) {
      if ($list1->val <= $list2->val) {
        $current->next = $list1;
        $list1 = $list1->next;
      } else {
        $current->next = $list2;
        $list2 = $list2->next;
      }
      $current = $current->next;
    }
    if ($list1 != null) {
      $current->next = $list1;
    } elseif ($list2 != null) {
      $current->next = $list2;
    }
    return $dummy->next;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文