📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 60(1)

📅  最后修改于: 2023-12-03 15:23:03.662000             🧑  作者: Mango

ISRO CS 2014 Question 60

题目描述

设计一个程序,将两个有序链表合并为一个有序链表并返回结果链表的头指针。

函数签名
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2);

其中,ListNode是链表节点的结构体。

例子
Input
l1: 1 -> 3 -> 5 -> 7 -> 9
l2: 2 -> 4 -> 6 -> 8 -> 10
Output
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10
思路解析

这道题其实就是链表合并的基本操作。我们可以从两个链表的头开始遍历,将较小的节点添加到结果链表的尾部,并将其指针向后移动一位。

最后,当其中一个链表已经遍历完了,我们就直接将另一个链表的剩下部分插入到结果链表的尾部即可。

具体的实现细节可以参考下面的代码。

代码实现
/**
 * 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) {
        ListNode dummy = ListNode(-1);
        ListNode* tail = &dummy;
        while (l1 && l2) {
            if (l1->val < l2->val) {
                tail->next = l1;
                l1 = l1->next;
            } else {
                tail->next = l2;
                l2 = l2->next;
            }
            tail = tail->next;
        }
        tail->next = l1 ? l1 : l2;
        return dummy.next;
    }
};

以上代码采用了一个dummy节点来简化代码,并且移动了指针,避免了大量的if语句。

总结

链表问题是非常基础的数据结构问题之一,掌握基本的链表操作是解决很多算法问题的基本前提。本题是链表合并的基础操作,需要善于使用虚拟节点和指针移动技巧。