已知有两个有序单链表la和lb(从小到大排列),其头指针分别为heada和headb,编写一个函数合并两个链表,并保证合并后的链表依然有序(从小到大排列),合并过程不允许使用其他数据结构。
时间: 2023-04-27 22:05:51 浏览: 110
可以使用双指针法,将两个链表中的节点逐一比较,将较小的节点插入到新链表中,直到其中一个链表为空。最后将剩余的节点直接插入到新链表的末尾即可。
具体实现步骤如下:
1. 定义一个新链表,头指针为head,初始化为空。
2. 定义两个指针p和q,分别指向la和lb的头节点。
3. 比较p和q指向的节点的值,将较小的节点插入到新链表的末尾,并将指针后移一位。
4. 重复步骤3,直到其中一个链表为空。
5. 将剩余的节点直接插入到新链表的末尾。
6. 返回新链表的头指针head。
代码实现如下:
ListNode* merge(ListNode* heada, ListNode* headb) {
ListNode* head = nullptr; // 新链表的头指针
ListNode* p = heada; // 指向la的指针
ListNode* q = headb; // 指向lb的指针
// 比较p和q指向的节点的值,将较小的节点插入到新链表的末尾,并将指针后移一位
while (p != nullptr && q != nullptr) {
if (p->val < q->val) {
if (head == nullptr) {
head = p;
} else {
head->next = p;
head = head->next;
}
p = p->next;
} else {
if (head == nullptr) {
head = q;
} else {
head->next = q;
head = head->next;
}
q = q->next;
}
}
// 将剩余的节点直接插入到新链表的末尾
if (p != nullptr) {
if (head == nullptr) {
head = p;
} else {
head->next = p;
}
}
if (q != nullptr) {
if (head == nullptr) {
head = q;
} else {
head->next = q;
}
}
return head;
}
阅读全文