加入结果链表时,还需要new关键字来为结果链表的新开辟的节点开辟空间,加入之后,将新加入结果链表的节点的指针向后移动,即指向下一个节点,随后继续比较,直到遇到nullptr则结束比较。下面是代码的实现:
class Solution {
public:
// 合并两个有序链表并返回合并后的链表头指针
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* Head = new ListNode(); // 创建一个虚拟头节点,方便处理合并链表
ListNode* listres = Head; // listres 用于指向合并链表的当前节点
ListNode* i = list1; // 指向 list1 的当前节点
ListNode* j = list2; // 指向 list2 的当前节点
// 当两个链表都有节点时,进行比较和合并
while(i != nullptr && j != nullptr) {
// 如果 list1 的当前节点值大于 list2 的当前节点值
if(i->val > j->val) {
listres->next = new ListNode(j->val); // 创建新的节点,并添加到合并链表中
j = j->next; // 移动 list2 的指针到下一个节点
listres = listres->next; // 移动指向合并链表的指针到下一个位置
continue; // 继续进行下一个循环
}
// 如果 list1 的当前节点值小于 list2 的当前节点值
if(i->val < j->val) {
listres->next = new ListNode(i->val); // 创建新的节点,并添加到合并链表中
i = i->next; // 移动 list1 的指针到下一个节点
listres = listres->next; // 移动指向合并链表的指针到下一个位置
continue; // 继续进行下一个循环
}
}
// 当 list1 中还有剩余节点时,将它们添加到合并链表中
while(i != nullptr) {
listres->next = new ListNode(i->val); // 创建新的节点,并添加到合并链表中
i = i->next; // 移动 list1 的指针到下一个节点
listres = listres->next; // 移动指向合并链表的指针到下一个位置
}
// 当 list2 中还有剩余节点时,将它们添加到合并链表中
while(j != nullptr) {
listres->next = new ListNode(j->val); // 创建新的节点,并添加到合并链表中
j = j->next; // 移动 list2 的指针到下一个节点
listres = listres->next; // 移动指向合并链表的指针到下一个位置
}
// 返回合并后的链表,跳过虚拟头节点
return Head->next;
}
};
基本没啥问题....
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
tmp1 := list1
tmp2 := list2
dummy := &ListNode{}
Tmp := dummy
for tmp1 != nil && tmp2 != nil {
if tmp1.Val <= tmp2.Val {
Tmp.Next = tmp1
Tmp = Tmp.Next
tmp1 = tmp1.Next
} else {
Tmp.Next = tmp2
Tmp = Tmp.Next
tmp2 = tmp2.Next
}
}
if tmp1 == nil {
Tmp.Next = tmp2
} else {
Tmp.Next = tmp1
}
return dummy.Next
}