这道题想要提高效率,必须考虑到的一点是,当一其中一个链表空了的时候,可以直接把另一个链表剩余部分整个拼上去,不需要一个一个遍历。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode* head = NULL; struct ListNode* p = NULL; if(!l1) return l2; else if(!l2) return l1; if(l1->val<l2->val){ head = l1; l1 = l1->next; }else{ head = l2; l2 = l2->next; } p = head; while(l1||l2){ if(l1&&l2){ if(l1->val<l2->val){ p->next = l1; l1 = l1->next; }else{ p->next = l2; l2 = l2->next; } }else if(l1){ p->next = l1; break; }else if(l2){ p->next = l2; break; } p=p->next; } return head; }
还有一种递归算法,效率差不多,可是递归算法不容易想明白。大概理解为按顺序读取进栈,然后递归返回时进行链表的组装。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode* result=NULL; if(l1==NULL) { return(l2); } if(l2==NULL) { return(l1); } if(l1->val<=l2->val) { result = l1; result->next=mergeTwoLists(l1->next,l2); } else { result=l2; result->next=mergeTwoLists(l1,l2->next); } return result; }