链表已经有序,可使用双指针l1和l2,分别指向第一个和第二个链表。再设置一个指向新链表头节点的指针,以及维护一个指向新链表最后一个节点的指针。使用双指针遍历遍历两个链表,比较后将节点添加到新链表的末尾。
反思:知道要使用双指针,但是并未想到设置哨兵和尾指针(指向新链表)。一开始的思路是将第二个链表的节一 个一个插入到第一个链表中。所以插入有三种情况:(1)在表头(2)在中间(3)在表尾。麻烦且容易出错,方向出现错误。改变思维,把合并后的新链表当成第三个链表,问题就变为构建第三个链表。将第二个链表中的节点插入到第一个链表的方法舍弃,改用将合适的节点添加到新链表的中去,。即从两个链表中选出合适的节点添加到新链表的末尾。由此简化了步骤,思考起来也简单。最后就是处理剩下的节点。
struct ListNode {
int val;
struct ListNode* next;
};
struct ListNode* mergeTwoList(struct ListNode* l1,struct ListNode* l2){
if(!l1||!l2)
return NULL;
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
struct ListNode *prehead,*tail;
//prehead为哨兵,指向新链表
prehead=(struct ListNode*)malloc(sizeof(struc ListNode));
prehead->next=NULL;
pre->head->val=0;
//tail指向新链表的最后一个节点
tail=prehead;
//遍历比较l1和l2
while(l1&&l2){
if(l1->val<=l2->val){
tail->next=l1;
tail=l1;
l1=l1-nwext;
}
else{
tail->next=l2;
tail=l2;
l2=l2->next;
}
}
//将剩下的链表节点链接起来
if(l1!=NULL)
tail->next=l1;
if(l2!=NULL)
tail->next=l2;
l1=prehead->next;
free(prehead);
return l1;
}