📅  最后修改于: 2023-12-03 15:23:03.662000             🧑  作者: Mango
设计一个程序,将两个有序链表合并为一个有序链表并返回结果链表的头指针。
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2);
其中,ListNode是链表节点的结构体。
l1: 1 -> 3 -> 5 -> 7 -> 9
l2: 2 -> 4 -> 6 -> 8 -> 10
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语句。
链表问题是非常基础的数据结构问题之一,掌握基本的链表操作是解决很多算法问题的基本前提。本题是链表合并的基础操作,需要善于使用虚拟节点和指针移动技巧。