将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
Definition for singly-linked list.struct ListNode {int val;struct ListNode *next;};typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1 ==NULL){return list2;}if(list2==NULL){return list1;}ListNode* l1=list1;ListNode* l2=list2;//创建新链表ListNode* listhead;ListNode* listtail;listhead=listtail=NULL;while(l1 && l2){//l1大if(l1->val > l2->val){//为空if(listhead==NULL){listhead=listtail=l2;}else{//不为空 尾插listtail->next=l2;listtail=listtail->next;}l2=l2->next;}else{//l2大//为空if(listhead == NULL){listhead=listtail=l1;}else{//不为空listtail->next=l1;listtail=listtail->next;}l1=l1->next;}}if(l1){listtail->next=l1;}if(l2){listtail->next=l2;}return listhead;
}
大框架就是把从小到大的依次放进新链表中。
先是判断一下如果链表1是空的话就直接返回链表2。如果链表2是空的话就直接返回链表1。然后创建新链表其实也可以先创建新链表在判断是否有空链表。
接下来就要比较了,用while循环判断条件是链表1和链表2(l1和l2)都不能为空。
在l1的值大于l2的值的情况下,因为是升序链表所以要先把小的放入链表中,如果新链表为空就把l2放入新链表中,如果新链表不为空就尾插。在l2大于l1的情况下,重复上面的步骤。注意在这之中不要忘了让节点的指针往后走。
像这种情况一个链表走完了,另一个链表还没有走完。我们就要判断了,如果l1不为空就把l1尾插,如果l2不为空就把l2尾插。