[leetcode]Merge Two Sorted Lists

来源:互联网 发布:网上群发短信软件 编辑:程序博客网 时间:2024/05/29 13:11

Merge Two Sorted Lists

 Total Accepted: 53948 Total Submissions: 164362My Submissions

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.


思路很简单,不要额外的内存,只是有四个指针,难免混乱。cur1,cur2,next1,next2.


初始位置如下:


第一步:如果next1 != NULL && next1->val <= cur2->val 则cur1与next1同时往后移动。直到next1->val>cur2->val


此时需要改变cur1的next指针


然后如果cur1->val >= cur2->val,让cur2与next2往后扫描,只要next2 != NULL && next2->val <= cur1->val就往后,


此时要改变cur2指向的next指针。


此时又回到了上面第一步。



代码如下:

// test21MergeTwoSortedLists.cpp : 定义控制台应用程序的入口点。


#include "stdafx.h"


struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}

};


ListNode* mergeTwoLists(ListNode* l1, ListNode* l2);


int _tmain(int argc, _TCHAR* argv[])
{
ListNode *r1;
ListNode *r2;
ListNode *r3;
ListNode *r4;
ListNode *r5;
ListNode *r6;
ListNode *r7;
ListNode *r8;
ListNode *r9;
ListNode *r10;
ListNode *r11;
ListNode *r12;
ListNode *r13;
ListNode *r14;
ListNode *r15;
r1 = new ListNode(0);
r3 = new ListNode(0);
r4 = new ListNode(0);
r5 = new ListNode(0);
r6 = new ListNode(0);
r7 = new ListNode(0);
r8 = new ListNode(0);
r9 = new ListNode(0);
r10 = new ListNode(0);
r11 = new ListNode(0);
r12 = new ListNode(0);
r13 = new ListNode(0);
r14 = new ListNode(0);
r15 = new ListNode(0);
r1->val = -9;
r1->next = r3;
r2 = new ListNode(0);
r2->val = -7;
r2->next = r4;

r3->val = -7;
r3->next = r5;

r4->val = -7;
r4->next = r6;

r5->val = -3;
r5->next = r7;

r6->val = -6;
r6->next = r8;


r8->val = -6;
r8->next = r10;


r10->val = -5;
r10->next = r12;


r12->val = -3;
r12->next = r14;


r14->val = 2;
r14->next = r15;


r15->val = 4;
r15->next = NULL;


r7->val = -3;
r7->next = r9;
r9->val = -1;
r9->next = r11;
r11->val = 2;
r11->next = r13;
r13->val = 3;
r13->next = NULL;




ListNode* res = mergeTwoLists(r1, r2);
return 0;
}


ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) 
{
ListNode* cur1;
ListNode* cur2;
ListNode* temp1;
ListNode* temp2;
ListNode* next1;
ListNode* next2;
int signal = 0;
if (l1 == NULL)
return l2;
if (l2 == NULL)
return l1;
cur1 = l1;
cur2 = l2;
if (cur1->val < cur2->val)
signal = 1;
else
signal = 2;
next1 = cur1->next;
next2 = cur2->next;
while (cur1 != NULL && cur2 != NULL)
{
if (cur1->val < cur2->val)
{
while (next1 != NULL && next1->val <= cur2->val)
{
cur1 = cur1->next;
next1 = next1->next;
}
if (next1 == NULL)
{
cur1->next = cur2;
if (signal == 1)
return l1;
else
return l2;
}
temp1 = cur1->next;
cur1->next = cur2;
cur1 = temp1;
next1 = cur1->next;


}
if (cur1->val >= cur2->val)
{
while (next2 != NULL && next2->val <= cur1->val)
{
cur2 = cur2->next;
next2 = next2->next;
}
if (next2 == NULL)
{
cur2->next = cur1;
if (signal == 1)
return l1;
else
return l2;
}
temp2 = cur2->next;
cur2->next = cur1;
cur2 = temp2;
next2 = cur2->next;
}


}




}


0 0
原创粉丝点击