class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* newhead = NULL;
ListNode* cur = NULL;
while (l1 != NULL && l2 != NULL) {
if (l1->val <= l2->val) {
newhead = newhead == NULL ? l1 : newhead;
if (cur == NULL) {
cur = l1;
}
else {
cur->next = l1;
cur = l1;
}
l1 = l1->next;
}
else {
newhead = newhead == NULL ? l2 : newhead;
if (cur == NULL) {
cur = l2;
}
else {
cur->next = l2;
cur = l2;
}
l2 = l2->next;
}
}
if (l1 == NULL && l2 == NULL) {
return NULL;
}
if (l1 == NULL) {
if (cur == NULL) {
newhead = l2;
}
else {
cur->next = l2;
}
}
if (l2 == NULL) {
if (cur == NULL) {
newhead = l1;
}
else {
cur->next = l1;
}
}
return newhead;
}
};
解题思路
分别用两个指针指向两个链表,取对应位置上的值进行比较,谁的值小就将谁接在新链表上,原链表上的指针同时向后移动,当有一个链表的指针到达结尾的时候,就将另一个链表接在新链表后面即可
代码实现细节
- 首先需要确认需要建立哪些变量,首先head1和head2题目中已经给出了,可以直接使用。新链表返回的时候,记录头节点的newhead;比较过程中,新链表上的当前指针cur用于不断连接新的节点。
- 首先分析给出的两个链表可能的情况
- 两个链表都有元素,那么就可以直接比较,直到某个链表为空
- 若两个链表都是空的,那么就无须排序,直接返回null就好了
- 若其中一个是空的,那么此刻直接返回另一组链表的头指针即可(此处的说明是在一开始的时候就判断某个链表是否为空,实际采用的是后面的做法,因为情况1后续的情况必然需要后续操作,在后续操作中加个判断就可以同时完成这两种情况),若将位置放在情况1之后再分析这种情况的时候,那么就需要判断cur是否发生了变化,如果仍然是null,说明没有进入情况1,直接返回另一个链表或者将newhead指向另一个链表头节点都可以,若是cur不是null,说明已经完成了情况1,此时将cur的后继接上另一个链表剩余的部分即可