16.合并两个排序的链表
2018-01-10 12:09
260 查看
1.思路:
双指针法,判断当前指针指向的两个数,将较小的数放入新链表中,选取的指针往后移位,直到到达NULL。需要注意的是,在对指针的使用时,若给的是两个相等的未赋值的野指针,则它们不是互相独立的,一个发生变化时另一个也会接着一起变,因此这里需要新建一个ListNode结点,先将两个指针指向结点,再做操作。
2.代码一(非递归):
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* res = new ListNode(-1); //注意:一定要先让两个指针指向某个结点,才能使两个指针相互独立,否则res与ptr实则为“同一个”野指针变量
ListNode* ptr;
ptr = res;
if(pHead1 == NULL) return pHead2;
if(pHead2 == NULL) return pHead1;
while(pHead1 && pHead2) {
if(pHead1->val < pHead2->val) {
ptr->next = pHead1;
ptr = ptr->next;
pHead1 = pHead1->next;
} else {
ptr->next = pHead2;
ptr = ptr->next;
pHead2 = pHead2->next;
}
}
if(pHead1 == NULL) {
ptr->next = pHead2;
} else {
ptr->next = pHead1;
}
return res->next;
}
};
代码二(递归):
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL) return pHead2;
if(pHead2 == NULL) return pHead1;
ListNode* newHead = NULL;
if(pHead1->val < pHead2->val) {
newHead = pHead1;
newHead->next = Merge(pHead1->next, pHead2);
} else {
newHead = pHead2;
newHead->next = Merge(pHead1, pHead2->next);
}
return newHead;
}
};
双指针法,判断当前指针指向的两个数,将较小的数放入新链表中,选取的指针往后移位,直到到达NULL。需要注意的是,在对指针的使用时,若给的是两个相等的未赋值的野指针,则它们不是互相独立的,一个发生变化时另一个也会接着一起变,因此这里需要新建一个ListNode结点,先将两个指针指向结点,再做操作。
2.代码一(非递归):
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* res = new ListNode(-1); //注意:一定要先让两个指针指向某个结点,才能使两个指针相互独立,否则res与ptr实则为“同一个”野指针变量
ListNode* ptr;
ptr = res;
if(pHead1 == NULL) return pHead2;
if(pHead2 == NULL) return pHead1;
while(pHead1 && pHead2) {
if(pHead1->val < pHead2->val) {
ptr->next = pHead1;
ptr = ptr->next;
pHead1 = pHead1->next;
} else {
ptr->next = pHead2;
ptr = ptr->next;
pHead2 = pHead2->next;
}
}
if(pHead1 == NULL) {
ptr->next = pHead2;
} else {
ptr->next = pHead1;
}
return res->next;
}
};
代码二(递归):
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL) return pHead2;
if(pHead2 == NULL) return pHead1;
ListNode* newHead = NULL;
if(pHead1->val < pHead2->val) {
newHead = pHead1;
newHead->next = Merge(pHead1->next, pHead2);
} else {
newHead = pHead2;
newHead->next = Merge(pHead1, pHead2->next);
}
return newHead;
}
};
相关文章推荐
- 剑指offer_16_合并两个排序的链表
- 【剑指offer】16合并两个排序的链表
- 16、合并两个排序的链表
- 16、合并两个排序的链表
- 剑指 Offer —16—合并两个排序的链表
- 剑指offer 16 合并两个排序的链表
- 剑指Offer(16)______合并两个排序的链表
- 剑指Offer--16.合并两个排序的链表
- 剑指offer(16)—合并两个排序的链表
- IMWeb提升营Day3 | 训练题16:合并两个排序的链表
- [剑指Offer] 16.合并两个排序链表
- 剑指Offer_16_合并两个排序的链表
- 16 合并两个排序的链表
- 剑指Offer面试题16反转链表(递归和非递归),面试题17合并两个排序的链表(递归)
- (C++)剑指offer-16:合并两个排序的链表(代码的鲁棒性)
- 剑指Offer面试题:16.合并两个排序的链表
- 剑指offer-16.合并两个排序的链表
- 剑指Offer——(16)合并两个排序的链表
- 剑指offer——16.合并两个排序的链表
- 剑指offer题解C++【16】合并两个排序的链表