Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
题意:
合并两个有序链表,返回新链表的头指针。注意:新链表应该由原两链表分割组合而成,不能新开辟空间。
分析:
题意很简单,如果没有后面的要求,我们只需要开辟新空间然后使用归并的思路就可以了。
但是这里题目要求不能开辟新的空间。
我们就需要注意了:还是使用归并的思路,只不过是将每个节点每个节点从原链表上链接到新链表上。
↓
l1: 1->4->5
↓
l1: 2->3>6
第一步指向最小的1,然后第一个指针顺势后移。
↓
l1: 4->5
↓
l2: 2->3>6
new: 1
然后指向最小的2,第二个指针
↓
l1: 4->5
↓
l2: 3>6
new: 1->2
等等.....
本题在面试时候需要注意的地方:
1.l1,l2可能为NULL。
2.当在移动过程中l1,l2可能为空
代码:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL)return l2;
if(l2 == NULL)return l1;
ListNode* head,*p;
if(l1->val > l2->val){
head = l2;
l2 = l2->next;
}else{
head = l1;
l1 = l1->next;
}
p = head;
p->next = NULL;
while(l1 != NULL && l2 != NULL){
if(l1->val < l2->val){
p->next = l1;
p = l1;
l1 = l1->next;
}else{
p->next = l2;
p = l2;
l2 = l2->next;
}
}
if(l1 != NULL)
p->next = l1;
if(l2 != NULL)
p->next = l2;
return head;
}
};