将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
思路:
这是一道简单难度的题目。用伪头部节点技巧,判断l2->val是否大于链表1的游标指向的节点值cursor1->val且同时小于该节点子节点值cursor1->next->val。如果是,则将该节点插入这个位置,且 cursor1 前进一步,直到l1或l2到达末尾。如果l1到达尾部而l2没有到达尾部,则将l2剩下的部分全部连接到l1尾部即可,因为l1和l2均为有序链表。
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == nullptr)
{
if(l2 == nullptr)
return nullptr;
else
return l2;
}
else
{
if(l2 == nullptr)
return l1;
}
//l1 != nullptr, l2 != nullptr
ListNode dummyHeadNode(-10000);
dummyHeadNode.next = l1;
ListNode* cursor1 = &dummyHeadNode,* cursor2 = l2;
while(cursor1 != nullptr && cursor1->next != nullptr && cursor2 != nullptr)
{
if(cursor1->val <= cursor2->val && cursor1->next->val > cursor2->val)
{
ListNode* temp = cursor2;
cursor2 = cursor2->next;
temp->next = cursor1->next;
cursor1->next = temp;
}
cursor1 = cursor1->next;
}
if(cursor1->next == nullptr && cursor2 != nullptr)
cursor1->next = cursor2;
return dummyHeadNode.next;
}
};
Published by