📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 51(1)

📅  最后修改于: 2023-12-03 14:50:48.122000             🧑  作者: Mango

国际空间研究组织(ISRO)CS 2017 – 5 月 | 问题 51

本题是一道关于数据结构的问题,考察程序员对链表的熟练使用。

问题描述

给定两个按递增顺序排序的链表ab,请将它们合并成一个新的有序链表,返回新链表的头节点。

示例
a = 1 -> 3 -> 5 -> None
b = 2 -> 4 -> 6 -> None

合并之后得到的新链表应该是:

result = 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> None
解题思路

题目要求我们将两个有序链表合并成一个新的有序链表,显然从两个有序链表的头节点开始比较,选择较小的节点,指向这个节点,然后继续向下比较,直到其中一个链表为空,此时将另一个链表剩余部分的节点全部添加到新链表中即可。

代码实现

我们可以使用递归或者迭代的方式来实现链表的合并,这里我提供一种迭代的解法,时间复杂度为O(n)。

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        dummy = ListNode(-1)    # 定义一个dummy节点作为新链表的头节点
        cur = dummy             # 定义一个指针cur指向dummy节点
        while l1 and l2:
            if l1.val < l2.val:
                cur.next = l1   # 将当前节点指向l1
                l1 = l1.next    # l1向下移动一位
            else:
                cur.next = l2   # 将当前节点指向l2
                l2 = l2.next    # l2向下移动一位
            cur = cur.next      # 当前节点指向下一个节点
        cur.next = l1 or l2     # 将剩余的节点添加到新链表中
        return dummy.next       # 返回新链表的头节点
总结

链表合并是一个非常经典的问题,也是面试中常被考到的题目。解决这类问题,我们需要掌握链表的基本操作和数据结构算法的思想,同时要注意边界情况和代码的优化。