赞
踩
方法一:若要求不能对原始链表更改,则必须使用额外空间
//使用额外空间来合并链表 不对原始链表做改变 node* mergeTwoLinkListWithExtraPlace(node *head1, node *head2) { /*先创建一个头结点 这里用任意的整数都可以 不一定用0 之后返回newHead->next 即可 该方法在很多时候都可以起到简化代码的作用 值得借鉴*/ node *newHead = new node(0); node *tail = newHead; //记录尾节点 方便尾插法 node *p = head1; node *q = head2; while (p && q) { if (p->data < q->data) { node *r = new node(p->data); p = p->next; tail->next = r; } else { node *r = new node(q->data); q = q->next; tail->next = r; } tail = tail->next; } //如果有一个链表到达了尾部 while (p) { node *r = new node(p->data); tail->next = r; tail = tail->next; p = p->next; } while (q) { node *r = new node(q->data); tail->next = r; tail = tail->next; q = q->next; } return newHead->next; //这里头结点直接丢弃 保证完整性 可以释放头结点 如下 /*node *r = newHead; newHead = newHead->next; delete r; r = nullptr; return newHead;*/ }
方法二:更改原始链表 主要利用循环实现
//非递归的方式 也成迭代法 node* mergeTwoSortedLinkListWithoutRecursion(node* head1, node* head2) { node* newHead = new node(0); //先创建一个链表头结点 返回的时候返回头结点下一个结点即可 node *p = head1; node *q = head2; node* tail = newHead; //这个结点用来记录合并后链表的尾节点 方便进行尾插法 while (p && q) { if (p->data < q->data) { tail->next = p; p = p->next; } else { tail->next = q; q = q->next; } tail = tail->next; } //以下情况是有一个链表走到了尾部 if (p) { tail->next = p; } if (q) { tail->next = q; } return newHead->next; //这里头结点最好释放一下 如下 /*node *r = newHead; newHead = newHead->next; delete r; r = nullptr; return newHead;*/ }
方法三:一般绝大多数链表和树的题目都可以用递归实现,注意递归出口条件
node* mergeTwoSortedLinkListWithRecursion(node* head1, node* head2) { //如果head1 和 head2有一个为空 则直接返回另一个 if (!head1) { return head2; } if (!head2) { return head1; } //递归可以理解为之后的情况都处理好了 只需要解决好当前这步就行了 if (head1->data < head2->data) { head1->next = mergeTwoSortedLinkListWithRecursion(head1->next, head2); return head1; } else { head2->next = mergeTwoSortedLinkListWithRecursion(head1, head2->next); return head2; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。