您的位置:首页 > 其它

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: