怎么合并两个有序链表
时间: 2024-01-24 15:12:58 浏览: 79
要合并两个有序链表,可以使用递归或迭代的方法。以下是迭代的方法:
假设有两个有序链表l1和l2,我们可以创建一个新的链表result,然后比较l1和l2的头节点,将较小的节点加入result中,直到其中一个链表为空。最后,将另一个非空链表的剩余部分加入result中。
以下是C++代码实现:
```c++
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* result = new ListNode(0);
ListNode* cur = result;
while (l1 != nullptr && l2 != nullptr) {
if (l1->val < l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if (l1 != nullptr) {
cur->next = l1;
} else {
cur->next = l2;
}
return result->next;
}
```
相关问题
c语言写:合并两个有序链表,编写一个函数,接受两个有序链表的头节点,将这两个链表合并为一个有序链表,并返回合并后的链表头节点
在C语言中,合并两个有序链表可以采用迭代或递归的方式实现。这里我们提供一个简单的迭代方法:
```c
// 定义链表节点结构体
typedef struct ListNode {
int val; // 节点值
struct ListNode *next; // 指向下一个节点的指针
} ListNode;
// 合并两个有序链表的函数
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 如果l1为空,则直接返回l2
if (l1 == NULL) return l2;
// 如果l2为空,则直接返回l1
if (l2 == NULL) return l1;
// 创建一个新的链表头节点,初始化为第一个非空链表的头部
ListNode* head = l1 > l2 ? l1 : l2;
ListNode* current = head;
// 依次比较两个链表的节点,选择较小的一个添加到结果链表中
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
current->next = l1;
l1 = l1->next;
} else {
current->next = l2;
l2 = l2->next;
}
current = current->next;
}
// 将剩余的链表节点添加到结果链表的尾部
if (l1 != NULL) current->next = l1;
else current->next = l2;
// 返回合并后的链表头节点
return head;
}
```
力扣合并两个有序链表
要合并两个有序链表,可以使用递归或迭代的方式。
以下是使用迭代的方法:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode:
# 创建一个哑结点作为合并后的链表的头结点
dummy = ListNode(0)
# 创建一个指针用于遍历合并后的链表
curr = dummy
while l1 and l2:
# 比较两个链表的当前节点值,将较小的节点链接到合并后的链表中
if l1.val <= l2.val:
curr.next = l1
l1 = l1.next
else:
curr.next = l2
l2 = l2.next
curr = curr.next
# 如果其中一个链表已经遍历完,直接将另一个链表剩余部分链接到合并后的链表中
if l1:
curr.next = l1
if l2:
curr.next = l2
# 返回合并后的链表的头结点
return dummy.next
```
这个方法的时间复杂度是 O(n + m),其中 n 和 m 分别是两个链表的长度。
希望对你有帮助!如果有任何其他问题,请随时问我。
阅读全文