已知两个带头结点的单链表中结点值均由小到大有序,设计一个算法,利用两个表原来的结点空间将它们合并成一个表,使合并后的结点值仍然有序。
时间: 2023-04-23 17:01:57 浏览: 109
可以使用双指针法,分别指向两个链表的头结点,比较两个指针所指结点的值大小,将较小的结点接到新链表的尾部,然后将指针向后移动一位,直到其中一个链表遍历完毕。最后将剩余的结点接到新链表的尾部即可。
具体实现如下:
1. 定义一个新的链表,用于存放合并后的结点。
2. 定义两个指针p1和p2,分别指向两个链表的头结点。
3. 比较p1和p2所指结点的值大小,将较小的结点接到新链表的尾部。
4. 将指针向后移动一位,继续比较两个指针所指结点的值大小,重复步骤3和4,直到其中一个链表遍历完毕。
5. 将剩余的结点接到新链表的尾部。
6. 返回新链表的头结点。
代码实现如下:
```
ListNode* merge(ListNode* head1, ListNode* head2) {
ListNode* dummy = new ListNode(); // 定义一个虚拟头结点
ListNode* tail = dummy; // 定义一个尾指针,用于连接新链表的结点
ListNode* p1 = head1->next; // 定义指针p1,指向链表1的第一个结点
ListNode* p2 = head2->next; // 定义指针p2,指向链表2的第一个结点
while (p1 && p2) { // 当两个链表都有结点时
if (p1->val < p2->val) { // 如果链表1的结点值小于链表2的结点值
tail->next = p1; // 将链表1的结点接到新链表的尾部
p1 = p1->next; // 将指针p1向后移动一位
} else { // 如果链表2的结点值小于等于链表1的结点值
tail->next = p2; // 将链表2的结点接到新链表的尾部
p2 = p2->next; // 将指针p2向后移动一位
}
tail = tail->next; // 将尾指针向后移动一位
}
if (p1) { // 如果链表1还有结点未遍历
tail->next = p1; // 将剩余的结点接到新链表的尾部
}
if (p2) { // 如果链表2还有结点未遍历
tail->next = p2; // 将剩余的结点接到新链表的尾部
}
return dummy->next; // 返回新链表的头结点
}
```
阅读全文