剑指 Offer 25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
注意:本题与主站 21 题相同:https://leetcode.cn/problems/merge-two-sorted-lists/
原站题解
rust 解法, 执行用时: 4 ms, 内存消耗: 2.1 MB, 提交时间: 2023-09-15 14:31:53
// 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(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> { match (l1, l2) { (Some(node1), None) => Some(node1), (None, Some(node2)) => Some(node2), (Some(mut node1), Some(mut node2)) => { if node1.val < node2.val { let n = node1.next.take(); node1.next = Solution::merge_two_lists(n, Some(node2)); Some(node1) } else { let n = node2.next.take(); node2.next = Solution::merge_two_lists(Some(node1), n); Some(node2) } }, _ => None, } } // 迭代 pub fn merge_two_lists2(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> { // Passed 4ms 2.1mb let (mut l1, mut l2) = (l1, l2); let mut head = Some(Box::new(ListNode { val: 0, next: None })); let mut node = head.as_mut(); while l1.is_some() && l2.is_some() { let cur; if l1.as_ref().unwrap().val <= l2.as_ref().unwrap().val { let next = l1.as_mut().unwrap().next.take(); cur = l1; l1 = next; } else { let next = l2.as_mut().unwrap().next.take(); cur = l2; l2 = next; } node.as_mut().unwrap().next = cur; node = node.unwrap().next.as_mut(); } node.as_mut().unwrap().next = if l1.is_some() { l1 } else { l2 }; head.unwrap().next } }
python3 解法, 执行用时: 68 ms, 内存消耗: 18.5 MB, 提交时间: 2023-09-15 14:29:35
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if l1 == None: return l2 elif l2 == None: return l1 elif l1.val < l2.val: l1.next = self.mergeTwoLists(l1.next, l2) return l1 else: l2.next = self.mergeTwoLists(l1, l2.next) return l2
cpp 解法, 执行用时: 20 ms, 内存消耗: 19.1 MB, 提交时间: 2023-09-15 14:27:48
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: // 递归 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == nullptr) { return l2; } else if (l2 == nullptr) { return l1; } else if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } } // 迭代 ListNode* mergeTwoLists2(ListNode* l1, ListNode* l2) { ListNode* preHead = new ListNode(-1); ListNode* prev = preHead; while (l1 != nullptr && l2 != nullptr) { if (l1->val < l2->val) { prev->next = l1; l1 = l1->next; } else { prev->next = l2; l2 = l2->next; } prev = prev->next; } // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可 prev->next = l1 == nullptr ? l2 : l1; return preHead->next; } };
javascript 解法, 执行用时: 104 ms, 内存消耗: 45.6 MB, 提交时间: 2023-09-15 14:27:01
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function(l1, l2) { if (l1 === null) { return l2; } else if (l2 === null) { return l1; } else if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } }; /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists2 = function(l1, l2) { const prehead = new ListNode(-1); let prev = prehead; while (l1 != null && l2 != null) { if (l1.val <= l2.val) { prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可 prev.next = l1 === null ? l2 : l1; return prehead.next; };
java 解法, 执行用时: 0 ms, 内存消耗: 42.1 MB, 提交时间: 2023-09-15 14:26:10
/** * 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) { if (l1 == null) { return l2; } else if (l2 == null) { return l1; } else if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } // 迭代 public ListNode mergeTwoLists2(ListNode l1, ListNode l2) { ListNode prehead = new ListNode(-1); ListNode prev = prehead; while (l1 != null && l2 != null) { if (l1.val <= l2.val) { prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可 prev.next = l1 == null ? l2 : l1; return prehead.next; } }
golang 解法, 执行用时: 4 ms, 内存消耗: 3.9 MB, 提交时间: 2023-09-15 14:25:10
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { prehead := &ListNode{Val:-1} prev := prehead for l1 != nil && l2 != nil { if l1.Val <= l2.Val { prev.Next = l1 l1 = l1.Next } else { prev.Next = l2 l2 = l2.Next } prev = prev.Next } if l1 == nil { prev.Next = l2 } else { prev.Next = l1 } return prehead.Next }
python3 解法, 执行用时: 56 ms, 内存消耗: 16.6 MB, 提交时间: 2023-09-15 14:21:28
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: prehead = ListNode(-1) prev = prehead while l1 != None and l2 != None: if l1.val <= l2.val: prev.next = l1 l1 = l1.next else: prev.next = l2 l2 = l2.next prev = prev.next prev.next = l2 if l1 == None else l1 return prehead.next
php 解法, 执行用时: 8 ms, 内存消耗: 16 MB, 提交时间: 2021-05-28 14:47:47
/** * Definition for a singly-linked list. * class ListNode { * public $val = 0; * public $next = null; * function __construct($val) { $this->val = $val; } * } */ class Solution { /** * @param ListNode $l1 * @param ListNode $l2 * @return ListNode */ function mergeTwoLists($node1, $node2) { $prehead = new ListNode(-1); $prev = $prehead; while ( $node1 != null && $node2 != null ) { if ( $node1->val <= $node2->val ) { $prev->next = $node1; $node1 = $node1->next; } else { $prev->next = $node2; $node2 = $node2->next; } $prev = $prev->next; } $prev->next = $node1 == null ? $node2 : $node1; return $prehead->next; } }