已知两个带头节点的单链表l1和l2中的结点值均已按升序排序,设计一个算法,将l1和l2就地合并成一个升序的带头节点单链表,合并之后l1和l2单链表为空,并用l3记录新的带头节点单链表的头指针。
时间: 2023-04-25 15:04:17 浏览: 201
带头结点的单链表的c算法实现
算法步骤如下:
1. 定义三个指针p1、p2、p3,分别指向l1、l2、l3的头节点;
2. 比较p1和p2所指节点的值,将较小值的节点接到p3的后面,并将p3指向新加入的节点;
3. 将p1或p2指向下一个节点,重复步骤2,直到p1或p2为空;
4. 将p1或p2剩余的节点接到p3的后面;
5. 返回l3的头指针。
代码实现如下:
```
ListNode* mergeList(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1->next;
ListNode* p2 = l2->next;
ListNode* p3 = new ListNode(); // 新链表的头节点
ListNode* tail = p3; // 记录新链表的尾节点
while (p1 && p2) {
if (p1->val <= p2->val) {
tail->next = p1;
p1 = p1->next;
} else {
tail->next = p2;
p2 = p2->next;
}
tail = tail->next;
}
if (p1) tail->next = p1;
if (p2) tail->next = p2;
l1->next = nullptr;
l2->next = nullptr;
ListNode* l3 = p3->next;
delete p3;
return l3;
}
```
阅读全文