原题: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.
将两个有序的链表整合应该是很简单的,只需比较两个链表的数就可以,需要注意的有这么几点:
1 初始状态下有某一个链表为空时,将另一个链表直接返回即可(不用管另一个是否是空)
2 由于这个题目中的struct已经定义,而且定义了个constructor,应该在new一个节点时,需要注意参数,参数为int
3 链表主要需要两个指针,一个head,用来返回,一个tail用来添加node
4 在循环中为tail添加node时,要检测一下head是否为空,若head为空,则说明是第一次添加node,将head和tail都指向node
代码如下:
class Solution {
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(l1==NULL) return l2;
if(l2==NULL) return l1;
ListNode * head = NULL;
ListNode * tail = head;
//两个list都没浏览完才能继续进行
while ( (l1 != NULL) && (l2 != NULL) ){
//两个都不为空时,必然需要添加一个node,先new一个,初始化为0
ListNode * newNode = new ListNode(0);
//判断两个节点的val值大小,将小的赋值给newNode,且要记住要前进一步
if((l1->val) > (l2->val)){
newNode->val = l2->val;
l2=l2->next;
}
else{
newNode->val = l1->val;
l1=l1->next;
}
//本代码关键所在
//由于每次添加node都要添加在tail端,因此若tail为空时,说明是第一次添加node,需要将head和tail都指向该node
if(tail == NULL){
head = newNode;
tail = head;
}
else{
//不为空,只需在tail端添加该node即可,同时把tail向后移一步
tail->next = newNode;
tail =tail->next;
}
}
//将另一个链表的剩余部分直接加载尾部就可以了
if(l1 == NULL){
tail->next=l2;
}
else {
tail->next=l1;
}
return head;
}
};