你可以帮我编写一个合并两个有序链表的代码吗
时间: 2024-05-10 14:16:42 浏览: 59
当然可以,以下是一个示例代码:
```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)
tail = dummy
while l1 and 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 or l2
return dummy.next
```
这个函数接受两个有序链表 `l1` 和 `l2` 作为输入,并返回一个合并后的有序链表。这个函数使用了一个哑结点 `dummy` 和一个尾指针 `tail`。在每次循环中,我们比较 `l1` 和 `l2` 的头结点的值,将较小的结点接在 `tail` 后面。然后,我们把 `tail` 指向新的结点。最后,我们将 `tail` 接在剩余的结点上,返回合并后的链表。
希望这个代码能够帮到你!
相关问题
你可以用C#帮我编写一个合并两个有序链表的代码吗
当然可以,以下是C#代码实现:
```csharp
using System;
public class ListNode {
public int val;
public ListNode next;
public ListNode(int val=0, ListNode next=null) {
this.val = val;
this.next = next;
}
}
public class Solution {
public ListNode MergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode();
ListNode current = dummy;
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;
}
if (l2 != null) {
current.next = l2;
}
return dummy.next;
}
}
public class Program {
public static void Main(string[] args) {
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(4);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
Solution solution = new Solution();
ListNode result = solution.MergeTwoLists(l1, l2);
while (result != null) {
Console.Write(result.val + " ");
result = result.next;
}
}
}
```
输出结果为:1 1 2 3 4 4
合并两个有序链表用c语言编写完整代码
以下是合并两个有序链表的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
ListNode* createList(int* nums, int size) {
ListNode* head = NULL;
ListNode** tail = &head;
for (int i = 0; i < size; i++) {
*tail = (ListNode*)malloc(sizeof(ListNode));
(*tail)->val = nums[i];
(*tail)->next = NULL;
tail = &((*tail)->next);
}
return head;
}
void printList(ListNode* head) {
while (head != NULL) {
printf("%d", head->val);
if (head->next != NULL) printf(" -> ");
head = head->next;
}
printf("\n");
}
int main() {
int nums1[] = {1, 3, 5, 7};
int nums2[] = {2, 4, 6, 8};
ListNode* l1 = createList(nums1, sizeof(nums1) / sizeof(int));
ListNode* l2 = createList(nums2, sizeof(nums2) / sizeof(int));
ListNode* merged = mergeTwoLists(l1, l2);
printList(merged);
return 0;
}
```
在主函数中,我们创建了两个有序链表l1和l2,然后调用mergeTwoLists函数将它们合并成一个有序链表merged,并调用printList函数打印输出结果。在createList函数中,我们使用双重指针tail来不断更新链表尾部,并返回链表头部。在mergeTwoLists函数中,我们使用递归方式将两个有序链表合并成一个有序链表。如果其中一个链表为空,我们直接返回另一个链表;否则,我们比较两个链表头部节点的值,将较小的节点作为合并后链表的头部,然后递归地将剩余的节点合并到该链表中。最后,我们返回合并后的链表头部。
阅读全文