leetcode 合并两个有序链表
今天跟同事一起刷了这个leetcode第二十一题,没有做出来
题目为:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4
可能是被题目的图误导了
https://assets.leetcode.com/uploads/2020/10/03/merge_ex1.jpg
思路是用l2为节点去解答这个题目,所以采用了错误的解法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l2) {
return l1;
}
if (!l1) {
return l2;
}
ListNode* tmpNodeL1 = l1;
ListNode* tmpNodeL2 = l2;
ListNode* tmpNode = nullptr;
while(tmpNodeL2 && tmpNodeL1) {
if (tmpNodeL1->val >= tmpNodeL2->val) {
tmpNode = tmpNodeL2;
if (tmpNode->next) {
//插入节点到指定的位置
while(tmpNode->next) {
if (tmpNode->next->val >= tmpNodeL1->val) {
ListNode* tmpNextNode = tmpNode->next;
tmpNode->next = tmpNodeL1;
tmpNodeL1 = tmpNodeL1->next;
tmpNode->next->next = tmpNextNode;
break;
}
tmpNode = tmpNodeL2->next;
}
} else {
tmpNode->next = tmpNodeL1;
tmpNodeL1 = tmpNodeL1->next;
tmpNode->next->next = nullptr;
}
} else {
}
tmpNodeL2 = tmpNodeL2->next;
}
return l2;
}
};
自己的算法解题,迭代器的解法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l2) {
return l1;
}
if (!l1) {
return l2;
}
ListNode* dummyHead = new ListNode();
ListNode* cur = dummyHead;
while(l1 || l2) {
if (l2 == nullptr) {
cur->next = l1;
break;
}
if (l1 == nullptr) {
cur->next = l2;
break;
}
std::cout << "l1:" << l1->val << std::endl;
std::cout << "l2:" << l2->val << std::endl;
if (l1->val < l2->val) {
cur->next = l1;
cur = cur->next;
l1 = l1->next;
std::cout << cur->val << std::endl;
} else {
std::cout << cur->val << std::endl;
cur->next = l2;
cur = cur->next;
l2 = l2->next;
}
}
return dummyHead->next;
}
};