C++之实现两个链表合并(迭代和递归版本)(19)---《那些奇怪的算法》
2017-11-20 17:51
811 查看
链表的结构:
struct ListNode{ int data; struct ListNode* next; };
迭代版本实现:
ListNode* mergeTwoLists_iter(ListNode* l1, ListNode*l2){ ListNode* head=NULL; ListNode* p = NULL; ListNode* p1=l1; ListNode* p2=l2; if (p1 == NULL&&p2 == NULL) return NULL; while (p1 != NULL&&p2 != NULL){ if (p1->data < p2->data){ if (head == NULL){ head = p1; p = head; } else{ p->next = p1; p = p->next; } p1 = p1->next; } else{ if (head == NULL){ head = p2; p = head; } else{ p->next = p2; p = p->next; } p2 = p2->next; } } if (p1 == NULL&&p2 != NULL){ if (head == NULL){ head = p2; p = head; } else{ p->next = p2; p = p->next; } p2 = p2->next; } if (p1 != NULL&&p2 == NULL){ if (head == NULL){ head = p1; p = head; } else{ p->next = p1; p = p->next; } p1 = p1->next; } return head; }
递归版本实现:
ListNode* mergeTwoLists_recur(ListNode* l1, ListNode* l2){ if (l1 == NULL) return l2; if (l2 == NULL) return l1; ListNode* head = NULL; if (l1->data < l2->data){ head = l1; head->next = mergeTwoLists_recur(l1->next, l2); }else{ head = l2; head->next = mergeTwoLists_recur(l1, l2->next); } return head; }
注意理解递归和迭代版本的思想啦,尤其针对递归部分需要认真理解!
PS:刚才我们处理的是合并两个排好序的链表,如果将2个链表换成多个链表呢?
ListNode* merge_multi_lists(vector<ListNode*>& vec){
int len = vec.size();
if (len == 0) return NULL;
if (len == 1) return vec[0];
ListNode* ret = merge(vec, 0, len);
return ret;
}
ListNode* merge(vector<ListNode*>& vec_list, int i, int j){
if (i == j) return vec_list[i];
ListNode* ret = NULL;
if (i < j){
int mid = (i + j) / 2;
ListNode* lhs = merge(vec_list, i, mid);
ListNode* rhs = merge(vec_list, mid + 1, j);
ret = mergeTwoLists_recur(lhs, rhs);
}
return ret;
}
ListNode* mergeTwoLists_recur(ListNode* l1, ListNode* l2){ if (l1 == NULL) return l2; if (l2 == NULL) return l1; ListNode* head = NULL; if (l1->data < l2->data){ head = l1; head->next = mergeTwoLists_recur(l1->next, l2); }else{ head = l2; head->next = mergeTwoLists_recur(l1, l2->next); } return head; }
相关文章推荐
- C++实现两个有序链表合并(17)---《那些奇怪的算法》
- 合并两个排序链表--迭代和递归分别实现
- C++实现两个已经排序的链表进行合并
- 合并两个有序的链表使新链表依然有序(不开辟新空间,在原链表上操作。 递归版本)
- 递归实现合并两个有序链表成一个链表依然有序
- 递归,迭代,堆栈三种方式实现单链表反转(C++)
- 合并两个已排序的链表(递归方法实现)
- 【编程题目】合并两个排序链表(C++实现)
- C++实现两个已经排序的链表进行合并
- 链表操作(将两个链表合并成一个链表依然有序,非递归方法和迭代方法)
- 【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】
- 剑指offer第十六题【合并两个排序的链表】c++实现
- C++之堆的实现(5)---《那些奇怪的算法》
- C++之实现大顶堆(1)---《那些奇怪的算法》
- 两个有序链表合并递归实现及非递归实现
- 递归实现合并两个有序链表
- 合并两个有序链表,递归实现
- C++实现二叉树的镜像操作(18)---《那些奇怪的算法》
- 用递归方法实现两个链表head1和head2各自有序,请把它们合并成一个链表仍然有序。(c/c++)
- 合并两个链表递归和非递归实现