设有两个有序单链表,一为升序,一为降序。试编写程序,将这两个链表合并为一个有序链表。
时间: 2023-03-22 10:00:47 浏览: 140
两个有序链表,合成为一个有序链表
好的,这是一个关于合并有序链表的问题。我们可以按照以下步骤来合并两个有序链表:
1. 定义一个新的链表头节点,和一个当前节点,初始值为null
2. 如果两个链表都非空,则比较它们的头节点的值,将较小的头节点加入新链表,并将当前节点指向这个新节点。
3. 继续比较两个链表的头节点,将较小的节点加入新链表,并将当前节点指向这个新节点。
4. 如果其中一个链表为空,则直接将非空链表的剩余节点加入新链表。
5. 返回新链表的头节点。
以下是实现的Java代码:
```java
public ListNode mergeLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1); // 创建一个虚拟头节点
ListNode cur = dummy; // 当前节点初始化为虚拟头节点
while (l1 != null && l2 != null) { // 遍历两个链表
if (l1.val <= l2.val) { // 比较头节点的值
cur.next = l1; // 将较小的头节点加入新链表
l1 = l1.next; // l1指向下一个节点
} else {
cur.next = l2; // 将较小的头节点加入新链表
l2 = l2.next; // l2指向下一个节点
}
cur = cur.next; // 将当前节点指向新加入的节点
}
if (l1 != null) { // 如果l1链表不为空,将其剩余节点加入新链表
cur.next = l1;
}
if (l2 != null) { // 如果l2链表不为空,将其剩余节点加入新链表
cur.next = l2;
}
return dummy.next; // 返回新链表的头节点
}
```
这个算法的时间复杂度是O(m+n),其中m和n是两个链表的长度。
阅读全文