问题描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
递归版本:
这个Merge函数可以看成最小值
当找到当前list1和list2中最小值之后,比如此刻是list1最小,那么就把寻找选一个值的任务交给下一个函数
在list1.next 和list2中寻找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public ListNode Merge(ListNode list1,ListNode list2) { if (list1 == null ){ return list2; } if (list2 == null ){ return list1; } if (list1.val <= list2.val){ list1.next = Merge(list1.next, list2); return list1; } else { list2.next = Merge(list1, list2.next); return list2; } } |
非递归版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | if (list1 == null ){ return list2; } if (list2 == null ){ return list1; } ListNode mergeHead = null ; ListNode current = null ; while (list1!= null && list2!= null ){ if (list1.val <= list2.val){ if (mergeHead == null ){ mergeHead = current = list1; } else { current.next = list1; current = current.next; } list1 = list1.next; } else { if (mergeHead == null ){ mergeHead = current = list2; } else { current.next = list2; current = current.next; } list2 = list2.next; } } if (list1 == null ){ current.next = list2; } else { current.next = list1; } return mergeHead; |
head是一个指向两个链表中最小的头节点,相当于给新的链表起的别名,谁小就指向谁
另一个指针p是用来把list1和list2中相比较最小值串接起来
我注释的应该能看懂
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(!pHead1)
return pHead2;
if(!pHead2)
return pHead1;
ListNode* Head;
ListNode* p;
//取较小值作头结点
if(pHead1->val<=pHead2->val){
Head=pHead1;
pHead1=pHead1->next;
}
else{
Head=pHead2;
pHead2=pHead2->next;
}
//开始遍历合并
p=Head; //p为合并后的链表的工作指针
while(pHead1&&pHead2){ //当有一个链表到结尾时,循环结束
if(pHead1->val<=pHead2->val){ //如果链表1的结点小于链表2的结点
p->next=pHead1; //取这个结点加入合并链表
pHead1=pHead1->next; //链表1后移一位
p=p->next; //工作指针后移一位
}
else{ //否则取链表2的结点
p->next=pHead2;
pHead2=pHead2->next;
p=p->next;
}
}
if(pHead1 == NULL) //链表1遍历完了
p->next = pHead2; //如果链表2也遍历完了,则pHead2=NULL
if(pHead2 == NULL) //链表2遍历完了
p->next = pHead1; ///如果链表1也遍历完了,则pHead1=NULL
return Head;
}
};