题目描述
将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。
解法
依次比较l1与l2中元素大小,将l2中元素插入到l1中。
在写程序时,我们先需考虑特殊情况,当l1或l2中至少有一个为空时,直接返回另一个链表。
然后开始依次比较两链表中的元素,需要注意的时,由于默认l1是不带头结点的,因此在l1的第一个结点之前插入l2中元素需要特别注意,若l2首元素小于l1首元素,则将l2首元素插入到l1首元素之前后,还需修改l1的指向。
开始依次比较两链表中的元素,p指向l1当前比较元素的前一个结点,q指向l2当前比较元素,r指向q的下一个结点,循环终止条件为l2全部插入完或者l1走到链表末尾。
class Solution {
public:
/**
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//l1或者l2为空
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
ListNode* p = l1;
ListNode* q = l2;
ListNode* r;
//处理l1第一个结点
if(l1->val > l2->val)
{
r = q->next;
q->next = l1;
l1 = q; //换表头
q = r;
p = l1;
}
while(p->next != NULL && q != NULL)
{
if(q->val < p->next->val)
{
r = q->next;
q->next = p->next;
p->next = q;
q = r;
p = p->next;
}
else p = p->next;
}
if(q == NULL)
{
return l1;
}
//在l1最后一个结点后插入
if(p->next == NULL)
{
p->next = q;
}
return l1;
}
};
假设两链表长度分别为n和m,时间复杂度O(n+m)
空间复杂度O(1)