解题思路直接见代码注释。
第一种常规思路,第二种递归。
没系统学过C++。只能凭借平时打比赛积累的一点C++知识,顺带查一查资料来写代码,难受啊。
练习注释的编写ing&代码风格重新调整ing
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//交替将两个链表中较小的节点插入新链表,然后将未空链表整体插入新链表即可。
ListNode *head1=l1,*head2=l2;
ListNode *head=new ListNode(0);
ListNode *dummy=head; //记录新链表的头节点
while(head1 != NULL && head2 != NULL){ //交替将两个链表中较小的节点插入新链表
if(head1->val <= head2->val){
head->next=head1;
head1=head1->next;
}
else{
head->next=head2;
head2=head2->next;
}
head=head->next;
}
if(head1 != NULL){ //将未空链表整个插入新链表
head->next=head1;
}
if(head2 != NULL){
head->next=head2;
}
return dummy->next;
}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//递归,如果一条链表为空,则返回另一条链表的开始节点。
//否则,则将较小的节点加入新链表并指向删去该节点后剩下的两条原始链表组成的升序链表。
if(l2==NULL) return l1;
if(l1==NULL) return l2;
if(l1->val <= l2->val){ //l1.val<=l2.val,将l1加入新链表指向以l1.next、l2开头的两条链表组成的升序链表的头节点
l1->next=Solution::mergeTwoLists(l1->next,l2);
return l1;
}
else{ //同理
l2->next=Solution::mergeTwoLists(l1,l2->next);
return l2;
}
}
};