题意
合并两个递增链表,并使合并后的链表仍然递增,如下图所示:
迭代法
- 设置一个虚拟头结点pre作为哨兵,并设置一个cur结点迭代;
- 遍历两个链表,如果head1->val小于等于head2->val,则让cur赋值为head1,head1更新为下一个结点,反之亦然;
- 在两个if分支之外要注意cur也要移动到下一个结点处;
- 别忘了把剩下的较长的一个链表全部拼接在cur后面;
- 最后返回pre->next即可。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* Head1, ListNode* Head2) {
ListNode* pre = new ListNode(-1);
ListNode* cur = pre;
while(Head1 && Head2){
if(Head1->val <= Head2->val){
cur->next = Head1;
Head1 = Head1->next;
}else{
cur->next = Head2;
Head2 = Head2->next;
}
cur = cur->next;
}
cur->next = Head1 ? Head1 : Head2;
return pre->next;
}
};
递归法
- 终止条件:当链表为空的时候,返回的应该是另一个链表的后续;
- 子问题:如果PHead1的所指节点值小于等于pHead2所指的结点值,那么phead1后续节点和pHead节点继续递归。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* Head1, ListNode* Head2) {
if(!Head1) return Head2;
if(!Head2) return Head1;
if(Head1->val <= Head2->val){
Head1->next = Merge(Head1->next, Head2);
return Head1;
}else{
Head2->next = Merge(Head1, Head2->next);
return Head2;
}
}
};