21-合并有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
运用比较头疼的递归算法,比较两个链表的大小,要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。
class Solution21{
public:
Node* mergeTwoLists(Node* l1, Node* l2) {
if (l1 == nullptr) {
return l2;
}
else if (l2 == nullptr) {
return l1;
}
else if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
int main()
{
int arrlian1[] = { 1, 3, 5 };
int arrlian2[] = { 2, 4, 6 };
int n1 = sizeof(arrlian1) / sizeof(arrlian1[0]); //在C语言中,获取数组的长度大小,即元素个数一般用 sizeof(arr) / sizeof(arr[0])来表示
int n2 = sizeof(arrlian2) / sizeof(arrlian2[0]);
Node *l1 = createList_array(arrlian1, n1);//完成对链表的输入数据,创建两个链表
Node *l2 = createList_array(arrlian2, n2);
Node *displist = lianbiao21.mergeTwoLists(l1, l2);
Solution21 lianbiao21;
创建数组链表的代码:
truct Node{
int val;
struct Node *next;//把这个链表的地址(下一个节点)定义为next
};
Node *createList_array(int *a, int n){//返回类型是指针的函数node * funcName()此函数读入链表
Node *root = new Node();//root是第一个节点
Node *head = root;//
for (int i = 0; i < n - 1; ++i){
root->val = a[i];//当前节点
root->next = NULL;
Node *p = new Node();//下一个结点
p->val = a[i + 1];
p->next = NULL;
root->next = p;// 连接 当前节点 与 下一个结点
root = root->next;
}
root->next = NULL;//这一句 最重要!!
return head;
}