您的位置:首页 > 编程语言 > C语言/C++

Leetcode c语言- Merge Two Sorted Lists

2017-09-18 13:45 309 查看
Title:

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.

这道题给定两个从小到大排列好的链表,然后合并为一个,要求新链表也是从小到大排列。

第一种思路是先选定一个链表l1,然后遍历链表l2,看l2的每一个节点与l1中节点的关系,然后插入该节点即可。解法如下:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* p=l1;
struct ListNode* q=l2;
struct ListNode* temp;
struct ListNode* result;

if(l1==NULL)
return l2;
if (l2==NULL)
return l1;

if (l1->val<=l2->val) {

while (l2) {
printf("%d\n",l2->val);
if (p->next==NULL) {
p->next=q;
return l1;
}

else if (q->val<= p->next->val) {

l2->next=p->next;
p->next=l2;
p=p->next;
l2=l2->next;
q=q->next;
}
else if (l2->val > p->next->val) {
p=p->next;
}
}
return l1;
}
else {
while (l1) {
if (q->next==NULL) {
q->next=p;
return l2;
}

else if ( l1->val<= q->next->val) {
temp=q->next;
q->next=l1;
q->next->next=temp;
q=q->next;
l1=l1->next;
}
else if (l1->val > q->next->val) {
q=q->next;
}
}
return l2;
}

}

这种解法存在一个致命的缺陷,要从l2中把一个节点插入l1中,无法做到:

l2->next=p->next;
p->next=l2;

一般将一个单独的节点插入一个链表的做法就是如上两行代码。但是对于一个链表中的一个节点插入到另一个链表中,方法失效。因为后续操作中,要遍历l2,就要将l2=l2->next,但这个时候l2->next=p->next,这个时候就会陷入一个死循环。

因此这道题的正确结题思路是新建一个新的链表,然后首先判断l1和l2的第一个节点大小,如果l1大,将新建的链表temp指向l1的第一个节点:

temp=l1;

然后判断l1和l2的节点大小,小的那方将节点插入temp,然后+1前进一个节点,直到两个链表中有一个率先到达最后,这个时候再将链表temp指向另一个链表的剩余部分,完成合并。

solution:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {

struct ListNode* temp;
struct ListNode* result;

if(l1==NULL)
return l2;
if (l2==NULL)
return l1;

if (l1->val<=l2->val) {
temp=l1;
l1=l1->next;
}
else {
temp=l2;
l2=l2->next;
}

result=temp;

while(l1 && l2) {
if (l1->val<=l2->val) {
temp->next=l1;
l1=l1->next;
}
else {
temp->next=l2;
l2=l2->next;
}
temp=temp->next;
}

if(l1) {
temp->next=l1;
}
else if(l2){
temp->next=l2;
}

return result;

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