c++两个有序链表合并成一个新的有序链表
时间: 2023-05-31 10:20:04 浏览: 117
### 回答1:
可以使用双指针法,分别指向两个链表的头节点,比较两个节点的值大小,将较小的节点加入新的有序链表中,然后将指针指向较小节点的下一个节点,直到其中一个链表遍历完毕,将另一个链表剩余的节点加入新的有序链表中即可。具体实现可以参考以下代码:
```c++
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode();
ListNode* cur = dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
cur->next = l1 ? l1 : l2;
return dummy->next;
}
int main() {
ListNode* l1 = new ListNode(1);
l1->next = new ListNode(3);
l1->next->next = new ListNode(5);
ListNode* l2 = new ListNode(2);
l2->next = new ListNode(4);
l2->next->next = new ListNode(6);
ListNode* l3 = mergeTwoLists(l1, l2);
while (l3) {
cout << l3->val << " ";
l3 = l3->next;
}
cout << endl;
return ;
}
```
### 回答2:
题目描述
给定两个有序链表,要求将其合并成一个新的有序链表。
解题思路
首先,我们需要了解什么是链表。链表是一种数据结构,它由一组节点组成,每个节点包含数据和指向下一个节点的指针。链表的特点是动态性和灵活性。
针对这道题目,我们首先需要明确什么是有序链表。有序链表就是链表中的元素按照一定的顺序排列。在本题中,我们需要将两个有序链表合并成一个新的有序链表,那么这个新的有序链表应该也是按照一定的顺序排列的。
我们可以使用迭代的方式进行合并,具体过程如下:
1. 首先定义一个空节点 dummy,作为新的链表的头节点。
2. 然后定义两个指针 p1 和 p2,分别指向两个有序链表的头部。
3. 如果 p1 的值小于等于 p2 的值,那么将节点 p1 加入到新链表中,同时将 p1 向后移动一位。否则将 p2 加入到新链表中,同时将 p2 向后移动一位。
4. 重复步骤 3 直到 p1 或者 p2 为空。
5. 将 p1 或者 p2 中剩余的节点接到新链表的末尾。
代码实现
以下为具体的代码实现:
### 回答3:
题目描述:
给定两个单调递增的链表,要将它们合并成一个新的递增链表。
输入:
我们需要输入两个有序链表,每个链表以数字节点为元素,节点按照从小到大的顺序排列。
例如,第一个链表是 1->2->4,第二个链表是 1->3->4->5。
输出:
输出合并后的新链表,同样按照从小到大的顺序排列。上述示例的输出应为 1->1->2->3->4->4->5。
思路:
由于两个输入的链表是有序的,因此可以通过比较两个链表头节点的大小,将较小的节点加入到新的链表中。然后对于每次加入的节点,需要将对应的链表头指针指向下一个节点,重复上述过程,直到将两个链表中所有节点都加入到新的链表中。
代码实现:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
# 创建一个哑节点,哑节点的next指向新链表的头节点
dummy = ListNode(0)
# 定义用于遍历两个链表的指针
p1, p2, cur = l1, l2, dummy
while p1 and p2:
if p1.val < p2.val:
cur.next = ListNode(p1.val)
p1 = p1.next
else:
cur.next = ListNode(p2.val)
p2 = p2.next
# 指向新链表的头节点
cur = cur.next
# 将未加入新链表的剩余节点加入新链表
if p1:
cur.next = p1
if p2:
cur.next = p2
return dummy.next
输入示例:
l1: 1->2->4
l2: 1->3->4->5
输出示例:
输出合并后的新链表:1->1->2->3->4->4->5.
阅读全文