转载:合并有序链表
【LeetCode021】合并有序链表
合并有序链表(Merge Two Sorted Lists)
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4输出:1->1->2->3->4->4
思路分析:
我们拿到题目首先注意到的是,有序,并且这两个链表的长度是不定的,所以有可能出现的情况是:一个链表为空,另外一个链表是4个长度。 这些细节我们在分析问题的时候都需要考虑到。
既然是有序链表,我们就需要比较两个数值的大小来决定谁排在前面。我们可以吧这个问题当成数组的问题,那么我们就需要重新设定一个新的数组,然后遍历这两个有序数组,然后小的存进新的数组。
而在链表中,我们需要先设定一个头结点,然后就相当于是定义了一个新的链表。我们把值一个一个往里面装就可以了,最后需要考虑的问题的是:链表的长度不一致的时候,我们需要把我们的新的链表指向还不为空的那个链表。


代码实现:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *head=new ListNode(0); //这里的head不能赋值l1,l2,或者空值,只能赋值为一个别的地址
ListNode *p=head;
while(l1!=NULL && l2!=NULL){
if(l1->val<=l2->val){
p->next=l1;
l1=l1->next;
}
else{
p->next=l2;
l2=l2->next;
}
p=p->next;
}
if(l1!=NULL)
p->next =l1;
if(l2!=NULL)
p->next =l2;
return head->next;
}
};
大家可以思考下,为什么我在赋值的时候不能赋值给head 空值或者是l1,l2 ,这里是因为是链表的头结点,所以不能为空值,那为什么不能是L1 或者l2呢,这是因为 我们赋值给head是地址,所以和L1,l2冲突。
这就是合并链表的思路和代码实现。
以上。