您的位置:首页 > Web前端

剑指offer-合并两个排序的链表

2017-05-05 20:18 190 查看

问题

题目:[合并两个排序的链表]

思路

传统merge的思路不说了,因为此时空间的复杂度是O(N).

主要说就地合并的思路。当然,这个题其实牛客的测试用例有问题,考虑不全面。

基本思想就是当p的当前值比q的当前值小的时候,q的上一个元素要指向p。当然,这有个前提是q的上一个元素不能指向pre_p,否则没有没有指向的意义。比如 1->3->5, 2->100->101。牛客没有考虑这种测试用例

代码

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p = pHead1;
ListNode* q = pHead2;

if(!p && !q) return NULL;
if(p && !q) return p;
if(!p && q) return q;

ListNode* p_pre = NULL;
ListNode* q_pre = NULL;
while(p&&q){
if( p->val < q->val ){
if(q_pre && q_pre->next != p_pre ){
q_pre->next = p;
}
p_pre = p;
p = p->next;
}
else{
if(p_pre && p_pre->next != q_pre ){
p_pre->next = q;
}
q_pre = q;
q = q->next;
}
}
if(p) q_pre->next = p;
if(q) p_pre->next = q;

if(pHead1->next == pHead2) return pHead1;
else return pHead2;

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