一、题目
二、思路和题解
1.思路
思路较为直观,直接按题目要求逐步处理。先考虑特殊情况:如果其中一个链表为空,则返回另一个链表(两个链表都为空的情况也包含在内)。
一般情况准备两个指针分别指向两个链表的头节点,每一步比较大小,将较小的值放入新创建的节点中,然后该链表的指针后移。循环终止条件为其中一个链表的节点遍历完毕。由于输入链表均为非降序排列,此时将另一个链表剩余部分拼接到合并链表末尾即可。
2.代码
/**
* 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* list1, ListNode* list2) {
// 特殊情况:当至少一个链表是空,直接返回另一条链表
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
// 定义两个指针方便取数比大小
ListNode* ptr1 = list1;
ListNode* ptr2 = list2;
// 新链表的第一个节点
ListNode* res = new ListNode();
ListNode* head = res; // 头指针
// 先比较第一个节点的数,谁小就谁放在新的节点里
if (ptr1->val <= ptr2->val) {
res->val = ptr1->val;
ptr1 = ptr1->next;
} else {
res->val = ptr2->val;
ptr2 = ptr2->next;
}
// 当某一个链表遍历完了就结束循环
while (ptr1 != nullptr && ptr2 != nullptr) {
ListNode* newnode = new ListNode();
res->next = newnode;
if (ptr1->val <= ptr2->val) {
newnode->val = ptr1->val;
ptr1 = ptr1->next;
} {
newnode->val = ptr2->val;
ptr2 = ptr2->next;
}
res = res->next;
}
(ptr1 == ) {
(ptr2 != ) {
ListNode* newnode = ();
res->next = newnode;
newnode->val = ptr2->val;
res = res->next;
ptr2 = ptr2->next;
}
} {
(ptr1 != ) {
ListNode* newnode = ();
res->next = newnode;
newnode->val = ptr1->val;
res = res->next;
ptr1 = ptr1->next;
}
}
head;
}
};


