关于合并和之前那道逆序,我想了一下看看能否合并也可以不用创建一个头节点,然而似乎事情没这么简单,还是得创建一个头节点,除非用递归的方法。。
递归法
重点注意:
1.触底条件的判断,当只要有一个为NULL则说明该组链表已经比较完,直接连上另一链表即可。
2.利用递归对单个符合要求的结点进行分散,注意return的位置。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head;
//触底条件:
if (l1 == NULL)
return head = l2;
if (l2 == NULL)
return head = l1;
//利用递归对其进行处理
if (l1 && l2)
//比较此时l1和l2的值,把小的作为当前结点取下。利用head->next不断把每个分散的结点连起来。
if (l1->val < l2->val)
{
head = l1;
head->next = mergeTwoLists(l1->next, l2);
}
else
{
head = l2;
head->next = mergeTwoLists(l1, l2->next);
}
return head;
}
};
双指针法
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//建立一个头节点用于保持操作的统一
ListNode* head = new ListNode;
head->next = NULL;
//建立cur指针用于连接符合条件的结点
ListNode* cur = head;
//若两者均不为空,则不断的比较和连接
while(l1!=NULL&&l2!=NULL){
if(l1->val<l2->val){
cur->next = l1;
l1=l1->next;
cur=cur->next;
}
else{
cur->next = l2;
l2=l2->next;
cur=cur->next;
}
}
//连接完后,若有不为空的结点,则将其连上。
if(l1==NULL){
cur->next = l2;
}
if(l2==NULL){
cur->next = l1;
}
//返回头节点的next
return head->next;
}
};